33
Datalogi 1F Forår 2003 G1 Jørgen Sværke Hansen [email protected]

Datalogi 1F Forår 2003 G1

  • Upload
    bryce

  • View
    36

  • Download
    0

Embed Size (px)

DESCRIPTION

Datalogi 1F Forår 2003 G1. Jørgen Sværke Hansen [email protected]. Planen for idag. Et gensyn med KFirst G1. Sidst så vi hvordan man starter den første proces. KCurProc = KWaitQ.Get(); KFirst(KCurProc->sp); hvor KFirst er defineret ved: KFirst:ldgp gp, (pv) ldq pv, 0xD8(a0) // Pop pv - PowerPoint PPT Presentation

Citation preview

Page 1: Datalogi 1F Forår 2003 G1

Datalogi 1F Forår 2003

G1

Jørgen Sværke Hansen

[email protected]

Page 2: Datalogi 1F Forår 2003 G1

Datalogi 1F: G1 2003 2

Planen for idag

• Et gensyn med KFirst

• G1

Page 3: Datalogi 1F Forår 2003 G1

Datalogi 1F: G1 2003 3

Sidst så vi hvordan man starter den første proces

KCurProc = KWaitQ.Get();KFirst(KCurProc->sp);

hvor KFirst er defineret ved:

KFirst: ldgp gp, (pv)ldq pv, 0xD8(a0) // Pop pvaddq a0, 0xF0,a0 // Skip

registrebis a0, 0, sp // Sæt spjmp (pv) // Hop til processtart

Page 4: Datalogi 1F Forår 2003 G1

Datalogi 1F: G1 2003 4

Indhold af G13 små opgaver:

1. Oversæt en kerne og afvikl den på en kernealpha

2. Håndoversæt en C/C++ funktion til alpha assembler

3. Implementer procedurer til dynamisk lagerallokering og anvend dem (inkl. aflusning) i en eksisterende kerne

Page 5: Datalogi 1F Forår 2003 G1

Datalogi 1F: G1 2003 5

Kernealphaerne

DIKU’s net

udviklingsAlpha

udviklingsAlpha

udviklingsAlpha

Ethernet HUB

Ethernet HUB

kerneAlpha

kerneAlpha

kerneAlpha

Konsolboks

Alphanettet

Linux PCsniffer

Page 6: Datalogi 1F Forår 2003 G1

Datalogi 1F: G1 2003 6

Alpha’erne

Udviklingsalpha’erne:• toke• vile• ve• bure• borr

Prøv:

ng2h del1-alpha

Kernealpha’erne• archimedes• diophant• eudoxos• euklid• hypatia• ptolemaios• pythagoras• thales• zenon

Page 7: Datalogi 1F Forår 2003 G1

Datalogi 1F: G1 2003 7

Page 8: Datalogi 1F Forår 2003 G1

Datalogi 1F: G1 2003 8

Page 9: Datalogi 1F Forår 2003 G1

Datalogi 1F: G1 2003 9

Page 10: Datalogi 1F Forår 2003 G1

Datalogi 1F: G1 2003 10

Page 11: Datalogi 1F Forår 2003 G1

Datalogi 1F: G1 2003 11

Page 12: Datalogi 1F Forår 2003 G1

Datalogi 1F: G1 2003 12

Opgave 1• Hent d-kernen, oversæt den og kør den på

en kerne-alpha:• d-kernen findes i ~dat1f/KB4/kerner• Kursusbog bind 5:

– Afsnit 3.5 beskriver hvordan man generelt oversætter, overfører og udfører et program på en kerne-alpha

– Afsnit 3.6 beskriver hvordan man oversætter, overfører og udfører en af kursusbog-kernerne på en kerne-alpha

Page 13: Datalogi 1F Forår 2003 G1

Datalogi 1F: G1 2003 13

Opgave 2• Håndoversættelse af en

C/C++ funktion til alpha-assembler

• Funktionen beregner udtryk der er specificeret via binære træer

x

x +

11 512 3

Page 14: Datalogi 1F Forår 2003 G1

Datalogi 1F: G1 2003 14

Knuderne i træet• Hver knude har formen:

typedef struct node {

int value;struct node *left;struct node *right;

} exprnode;

• Hvis knuden er en intern knude (dvs. hvis (left != NULL) && (right != NULL) angiver value en operation:– 1 angiver addition– 2 angiver multiplikation

• Hvis knuden er en bladknude, angive value en heltallig værdi

Page 15: Datalogi 1F Forår 2003 G1

Datalogi 1F: G1 2003 15

Beregningsfunktionenint calc(exprnode *root) { int rval, lval;

if(root == NULL) return 0;

if((root->left == NULL)&&(root->right == NULL)) return root->value; else { lval = calc(root->left); rval = calc(root->right); switch(root->value) { case ADDOP: return lval+rval; case MULOP: return lval*rval; default: return 0; } }}

Page 16: Datalogi 1F Forår 2003 G1

Datalogi 1F: G1 2003 16

Testeksempler

• I ~dat1f/G1/trees.h er der angivet en række testtræer:

// Tree 0: result 42

exprnode t0_n1_1 = {42, NULL, NULL};

exprnode *t0_root = &t0_n1_1;

• samt definitionen af exprnode

Page 17: Datalogi 1F Forår 2003 G1

Datalogi 1F: G1 2003 17

Alpha-assembler

• Beskrives i kursusbog bind 5:– Kapitel 4: Programmering i Alpha-

assembler

Page 18: Datalogi 1F Forår 2003 G1

Datalogi 1F: G1 2003 18

Funktionsdefinition i Alpha-assembler

.ent calc .globl calc

calc: ldgp gp, (pv) <gem udvalg af registre på

stakken>

<programkode for calc>

<reetabler registre fra stakken> ret (ra) .end calc

Page 19: Datalogi 1F Forår 2003 G1

Datalogi 1F: G1 2003 19

Funktionskald i alpha-assembler

<gem udvalgte registre på stak>

<initialiser argumentregistre>

lda pv, calc

jsr ra, (pv)

ldgp gp, (ra)

<processering af returværdi (v0)>

<retabler udvalgte registre fra stak>

Page 20: Datalogi 1F Forår 2003 G1

Datalogi 1F: G1 2003 20

Registrene på en AlphaRegister Navn Funktion Hvem

gemmer

$0 v0 Returværdi kaldende

$1-$8 t0-t7 Temp. registre kaldende

$9-$15 s0-s6 Mellemregn. overlever funktionsk.

kaldte

$16-$21 a0-a5 Funktionsargumenter kaldende

$22-$25 t8-t11 Mellemregninger kaldende

$26 ra Returadresse kaldte

$27 pv Addr. på kaldte procedure kaldende

$28 at Reserveret assembler kaldende

$29 gp Global peger kaldende

$30 sp Stak peger Kaldte

$31 zero Er altid nul

Page 21: Datalogi 1F Forår 2003 G1

Datalogi 1F: G1 2003 21

Opgave 3

• Bibliotek til dynamisk lagerallokering

• To funktioner:void *malloc(size_t size): allokerer

en klods lager af størrelsen size på hoben

void free(void *p): frigiver den klods lager, som p peger på

Page 22: Datalogi 1F Forår 2003 G1

Datalogi 1F: G1 2003 22

Diverse

• G1 skal afleveres onsdag 26. februar klokken 14:00 i DIKUs førstedelsadministration

• Sammen med G1 har I fået fra Kernighan & Ritchie: The C Programming Language (2nd edition) fået udleveret:– Kapitel 5: Pointers and Arrays– Kapitel 6: Structures– Appendiks B: Standard Library

Page 23: Datalogi 1F Forår 2003 G1

Datalogi 1F: G1 2003 23

Lagerallokering:malloc/free eksempel

int main (void) {exprnode *enode;

enode = (exprnode *) malloc(sizeof(exprnode));

enode->value = 54;enode->left = NULL;enode->right = NULL;

printf(”%d\n”, calc(enode));

free(enode);}

Page 24: Datalogi 1F Forår 2003 G1

Datalogi 1F: G1 2003 24

Lagerallokering:new/delete eksempel

int main (void) {exprnode *enode;

enode = new exprnode; // ingen typecast/size_of

enode->value = 54;enode->left = NULL;enode->right = NULL;

printf(”%d\n”, calc(enode));

delete enode;}

Page 25: Datalogi 1F Forår 2003 G1

Datalogi 1F: G1 2003 25

Allokering af hukommelse

• Funktioners lokale variable allokeres typisk på stakken

• Dynamisk allokerede variable allokeres på hoben

HOB

KODE

STAK

Page 26: Datalogi 1F Forår 2003 G1

Datalogi 1F: G1 2003 26

Allokering af objekter på hoben: simpel algoritme

• Hoben består af en samling klodser af data, der enten:– er allokerede (dvs. optaget)– er frie (ikke optaget)

• Ved et kald til malloc skal der findes en fri blok, der har mindst samme størrelse som den forespurgte (og helst samme størrelse).

• Ved et kald til free markeres blokken som værende fri.

Page 27: Datalogi 1F Forår 2003 G1

Datalogi 1F: G1 2003 27

Ledig: NejLedig: Ja

Ledig: Nej

Eksempel på administration af hob

0x038.0000

Ledig: Ja

0x038.0000

0x040.0000

0x036.00000x000.0000

Ledig: Ja

0x000.0000

0x000.00000x036.0000

p = malloc(0x007.FFF0);

p2 = malloc(0x007.FFF0);

free(p);

free(p2);

Page 28: Datalogi 1F Forår 2003 G1

Datalogi 1F: G1 2003 28

Kommentarer til implementation

• I kan antage at argumentet til free altid har en korrekt værdi (men ellers kan de klares med f.eks. et magisk tal)

• Algoritmen lider af intern fragmentering: I er velkomne til f.eks. at sammenlægge blokke, men det er ikke et krav

• I kan IKKE flytte rundt på allokerede blokke!

Page 29: Datalogi 1F Forår 2003 G1

Datalogi 1F: G1 2003 29

Udførsel på kernealphaerne• Programmer på kernealphaerne har kun

de funktioner til rådighed, der er implementeret i den benyttede kerne:– intet standardbibliotek eller køretidsbibliotek

er tilgængeligt for jeres kode– der er f.eks. ikke indbyggede standard

funktioner for new og delete• destruktøren for en klasse kalder en funktion __builtin_delete, der ikke er defineret

– konstruktører og destruktører kaldes ikke automatisk for statisk allokerede klasser

Page 30: Datalogi 1F Forår 2003 G1

Datalogi 1F: G1 2003 30

Aflusning• Til aflusning af kode på udviklingsalphaerne:

– gdb

• Til aflusning af kode på kernealpha’erne:– ladebug (fjerndebugger med kildetekstsupport der

styres fra en udviklingsalpha)– debug monitor på alphaerne

• Lav først en version, der virker på udviklingsalpha’erne (se evt. testprogram.cc for at se hvordan det kan gøres)

Page 31: Datalogi 1F Forår 2003 G1

Datalogi 1F: G1 2003 31

Referencer i C++void g(){int s = 0;int& sr = s;sr += 5; // sr = 5 efter detteint *ps = &s;*ps += 5; // s == sr == *ps == 10ps += 5; // addr ps forhøjes med

// 5*4 bytes}

Page 32: Datalogi 1F Forår 2003 G1

Datalogi 1F: G1 2003 32

Mere reference

void inc(int& val)

{

val++;

}

main() {

val = 1;

inc(val); //val == 2

}

void inc(int* val){

(*val)++;}

main() {val = 1;inc(&val); //val == 2

}

Page 33: Datalogi 1F Forår 2003 G1

Datalogi 1F: G1 2003 33

• Brug nyhedsgruppen diku.dat1f hvis I har problemer eller spørgsmål

• Vi ses næste gang den 28. februar!!