1 / 33

Datalogi 1F Forår 2003 G1

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

bryce
Download Presentation

Datalogi 1F Forår 2003 G1

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Datalogi 1F Forår 2003G1 Jørgen Sværke Hansen cyller@diku.dk

  2. Planen for idag • Et gensyn med KFirst • 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 pv addq a0, 0xF0,a0 // Skip registre bis a0, 0, sp // Sæt sp jmp (pv) // Hop til processtart Datalogi 1F: G1 2003

  4. 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

  5. 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

  6. 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

  7. Datalogi 1F: G1 2003

  8. Datalogi 1F: G1 2003

  9. Datalogi 1F: G1 2003

  10. Datalogi 1F: G1 2003

  11. 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 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 + 12 3 11 5 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 Datalogi 1F: G1 2003

  15. 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

  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 Datalogi 1F: G1 2003

  17. Alpha-assembler • Beskrives i kursusbog bind 5: • Kapitel 4: Programmering i Alpha-assembler 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 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> Datalogi 1F: G1 2003

  20. Registrene på en Alpha 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å 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 Datalogi 1F: G1 2003

  23. 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

  24. 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

  25. Allokering af hukommelse • Funktioners lokale variable allokeres typisk på stakken • Dynamisk allokerede variable allokeres på hoben HOB KODE STAK 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. Datalogi 1F: G1 2003

  27. 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

  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! 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 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) Datalogi 1F: G1 2003

  31. 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

  32. 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

  33. Brug nyhedsgruppen diku.dat1f hvis I har problemer eller spørgsmål • Vi ses næste gang den 28. februar!! Datalogi 1F: G1 2003

More Related