330 likes | 482 Views
Datalogi 1F Forår 2003 G1. Jørgen Sværke Hansen cyller@diku.dk. 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
E N D
Datalogi 1F Forår 2003G1 Jørgen Sværke Hansen cyller@diku.dk
Planen for idag • Et gensyn med KFirst • G1 Datalogi 1F: G1 2003
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: G1 2003
Indhold af G1 3 små opgaver: • Oversæt en kerne og afvikl den på en kernealpha • Håndoversæt en C/C++ funktion til alpha assembler • Implementer procedurer til dynamisk lagerallokering og anvend dem (inkl. aflusning) i en eksisterende kerne Datalogi 1F: G1 2003
Kernealphaerne DIKU’s net udviklings Alpha udviklings Alpha udviklings Alpha Konsolboks kerne Alpha kerne Alpha kerne Alpha Alpha nettet Ethernet HUB Linux PC sniffer Ethernet HUB Datalogi 1F: G1 2003
Udviklingsalpha’erne: toke vile ve bure borr Prøv: ng2h del1-alpha Kernealpha’erne archimedes diophant eudoxos euklid hypatia ptolemaios pythagoras thales zenon Alpha’erne Datalogi 1F: G1 2003
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: G1 2003
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 + 12 3 11 5 Datalogi 1F: G1 2003
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: G1 2003
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: G1 2003
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: G1 2003
Alpha-assembler • Beskrives i kursusbog bind 5: • Kapitel 4: Programmering i Alpha-assembler Datalogi 1F: G1 2003
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 Datalogi 1F: G1 2003
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> Datalogi 1F: G1 2003
Registrene på en Alpha Datalogi 1F: G1 2003
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: G1 2003
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: G1 2003
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); } Lagerallokering:malloc/free eksempel Datalogi 1F: G1 2003
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; } Lagerallokering:new/delete eksempel Datalogi 1F: G1 2003
Allokering af hukommelse • Funktioners lokale variable allokeres typisk på stakken • Dynamisk allokerede variable allokeres på hoben HOB KODE STAK Datalogi 1F: G1 2003
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: G1 2003
Eksempel på administration af hob 0x040.0000 0x038.0000 0x000.0000 Ledig: Nej Ledig: Ja p = malloc(0x007.FFF0); p2 = malloc(0x007.FFF0); 0x038.0000 0x036.0000 0x000.0000 free(p); Ledig: Nej Ledig: Ja free(p2); 0x036.0000 0x000.0000 Ledig: Ja Datalogi 1F: G1 2003
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: G1 2003
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: G1 2003
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: G1 2003
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: G1 2003
void inc(int& val) { val++; } main() { val = 1; inc(val); //val == 2 } void inc(int* val) { (*val)++; } main() { val = 1; inc(&val); //val == 2 } Mere reference Datalogi 1F: G1 2003
Brug nyhedsgruppen diku.dat1f hvis I har problemer eller spørgsmål • Vi ses næste gang den 28. februar!! Datalogi 1F: G1 2003