Datalogi 1F Forår 2003 G1

Preview:

DESCRIPTION

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 - PowerPoint PPT Presentation

Citation preview

Datalogi 1F Forår 2003

G1

Jørgen Sværke Hansen

cyller@diku.dk

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!!

Recommended