Datalogi 1F Forår 2003 G1 Jørgen Sværke Hansen
Datalogi 1F: G Planen for idag Et gensyn med KFirst G1
Datalogi 1F: G 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 addq a0, 0xF0,a0 // Skip registre bis a0, 0, sp // Sæt sp jmp (pv) // Hop til processtart
Datalogi 1F: G Indhold af G1 3 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
Datalogi 1F: G Kernealphaerne DIKU’s net udviklings Alpha udviklings Alpha udviklings Alpha Ethernet HUB kerne Alpha kerne Alpha kerne Alpha Konsolboks Alpha nettet Linux PC sniffer
Datalogi 1F: G 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
Datalogi 1F: G
8
9
10
Datalogi 1F: G
Datalogi 1F: G 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
Datalogi 1F: G 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
Datalogi 1F: G 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
Datalogi 1F: G Beregningsfunktionen int 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; }
Datalogi 1F: G 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
Datalogi 1F: G Alpha-assembler Beskrives i kursusbog bind 5: –Kapitel 4: Programmering i Alpha- assembler
Datalogi 1F: G Funktionsdefinition i Alpha- assembler.ent calc.globl calc calc: ldgp gp, (pv) ret (ra).end calc
Datalogi 1F: G Funktionskald i alpha-assembler lda pv, calc jsr ra, (pv) ldgp gp, (ra)
Datalogi 1F: G Registrene på en Alpha RegisterNavnFunktionHvem gemmer $0v0Returværdikaldende $1-$8t0-t7Temp. registrekaldende $9-$15s0-s6Mellemregn. overlever funktionsk. kaldte $16-$21a0-a5Funktionsargumenterkaldende $22-$25t8-t11Mellemregningerkaldende $26raReturadressekaldte $27pvAddr. på kaldte procedurekaldende $28atReserveret assemblerkaldende $29gpGlobal pegerkaldende $30spStak pegerKaldte $31zeroEr altid nul
Datalogi 1F: G 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å
Datalogi 1F: G 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
Datalogi 1F: G 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); }
Datalogi 1F: G 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; }
Datalogi 1F: G Allokering af hukommelse Funktioners lokale variable allokeres typisk på stakken Dynamisk allokerede variable allokeres på hoben HOB KODE STAK
Datalogi 1F: G 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.
Datalogi 1F: G Ledig: NejLedig: Ja Ledig: Nej Eksempel på administration af hob 0x Ledig: Ja 0x x x x Ledig: Ja 0x x p = malloc(0x007.FFF0); p2 = malloc(0x007.FFF0); free(p); free(p2);
Datalogi 1F: G 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!
Datalogi 1F: G 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
Datalogi 1F: G 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)
Datalogi 1F: G Referencer i C++ void g() { int s = 0; int& sr = s; sr += 5; // sr = 5 efter dette int *ps = &s; *ps += 5; // s == sr == *ps == 10 ps += 5; // addr ps forhøjes med // 5*4 bytes }
Datalogi 1F: G 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 }
Datalogi 1F: G Brug nyhedsgruppen diku.dat1f hvis I har problemer eller spørgsmål Vi ses næste gang den 28. februar!!