Datalogi 1F: G1 2003 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 pvaddq a0, 0xF0,a0 // Skip
registrebis a0, 0, sp // Sæt spjmp (pv) // Hop til processtart
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
Datalogi 1F: G1 2003 5
Kernealphaerne
DIKU’s net
udviklingsAlpha
udviklingsAlpha
udviklingsAlpha
Ethernet HUB
Ethernet HUB
kerneAlpha
kerneAlpha
kerneAlpha
Konsolboks
Alphanettet
Linux PCsniffer
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
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 +
11 512 3
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
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; } }}
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 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
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
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: 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;}
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
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);
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 detteint *ps = &s;*ps += 5; // s == sr == *ps == 10ps += 5; // addr ps forhøjes med
// 5*4 bytes}
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
}
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!!