Datorsystemteknik DAVA14 Föreläsning 10 Från källkod till bitar Samspelet mellan program och hårdvara Med bilder från Mats Brorsson, Datorsystem: Program och maskinvara, studentlitteratur 1999 Assemblatorn Översätter assemblerspråk till binärkod Preprocessorn ersätter definierade uttryck med verkliga värdet. Assemblatorn översätter oftast i två faser. Fas1: räknar ut adresser skapar symboltabell (symbol,värde, typ, var), ersätter ASCII värden. Försöker fylla hoppluckor Ersätter syntetiska operationer Fas2: Översätter rad för rad Ersätter symboler med värden Assemblatorn (forts) Kompilatorn Lexikal och syntaxanalys Består av sex steg Lexikalanalys Syntaxanalys Semantisk analys Optimering Generering av maskinkod Eventuella maskinberoende optimeringar 1
Optimering Ett antal olika steg finns Eliminering av dubbla beräkningar Hoppoptimering Utbyte av tidskrävande instruktioner Optimering av slingor Inkopiering av funktioner Registerallokering Kodomstrukturering Eliminering av dubbla beräkningar Kallas CSE (Common sub-expression elimination) Ersätter beräkningar som utförs flera gånger i koden med värden. Optimerar hämtning av variabler från minne till register. Kan bara operera på ett basblock Hoppoptimering Tar bort redundanta tester Tar bort onödiga hopp Ersätter hoppkedjor genererade av kompilatorn med ett hopp. Utbyte av tidskrävande instruktioner p = a * b; p = a * 35; För första satsen genereras: mult a0,a1 #multiplikation mflo v0 #Resultat från LO (Tar 12 klockcykler att utföra 11+1) För andra satsen genereras: sll v0,a0,3 # x8 addu v0,v0,a0 # x9 sll v0,v0,2 # x36 subu v0,v0,a0 # x35 Optimering av slingor Går igenom programslingor. Börjar i innersta slingan och går utåt Flyttar beräkningar som inte beror av slingan utanför den. Förenklar uttryck som beror enkelt på iterationsvariabeln Utför loop-unrolling om det behövs och är önskvärt. int i, x[100]; for (i = 0; i < 100; i++) x[i] = 23; Registerallokering Försöker se till att ett värde ligger i register så länge som möjligt. Kan vara svårt att välja ut vilka variabler som kan ligga i minnet. Pekare? Stackvariabler? Underlättas om processorn har många register. 2
Problem med optimering unsigned char *status = (unsigned char*) 0xbfcc0020; unsigned char *keyboard = (unsigned char*) 0xbfcc0000; Problem med optimering unsigned char *status = (unsigned char*) 0xbfcc0020; unsigned char *keyboard = (unsigned char*) 0xbfcc0000; char getchar(){ while (! (*status & 0x80)) ; return *keyboard; } char getchar(){ unsigned char tmp = (*status & 0x80); while (! ymp ) ; return *keyboard; } Kod som förstör Aritmetik på tal mindre än ett ord. Utförs mindre effektivt Extrahera adressen till en lokal variabel Tvingar kompilatorn att lägga adressen i minnet i stället för i ett register. Inkapslade funktionsanrop Gör det svårare för kompilatorn att utföra register allokering Objektkod Objektkodsfilen har följande delar Filinformation Filens uppbyggnad och delarnas storlek Textsegment Programkoden Datasegment Data och storlek på statisk data Relokeringsinformation Instruktioner som består av absoluta adresser Symboltabell Felsökningsinformation Adresstilldelning Adresstilldelning 3
Operativsystem Funktionen och uppgifterna hos operativsystemet kan kort beskrivas i två punkter: Bekvämlighet Operativsystemet gör datorsystemet mer bekvämt att använda för såväl programmerare som andra användare av systemet. Effektivitet I de flesta datorsystem har operativsystemet också en uppgift att se till att datorns resurser används på mest effektiva sätt. Operativsystem Ett operativsystem har stödfunktionalitet för: Programkörning Tillgång till I/O enheter Minneshantering Kontrollerad åtkomst till filer Säkerhetsmekanismer Felhantering Utveckling (API) Systemanrop Exempel på systemanrop int fil; /* Deklarera en fildeskriptor */ int tal = 54; fil = open( minfil, O_CREAT O_WRONLY); write(fil, &tal, 4); /* Skriv ett ord */ close(fil); /* Stäng filen */ Minnesrymden Gången hos ett systemanrop 4
Processhantering Minneshantering Filsystem Ett filsystem är en samling funktioner som ger tillgång till lagring av data på disk på ett strukturerat sätt. Samma systemanrop för att exempelvis läsa filer (oberoende av typ av enhet). Filerna i ett filsystem kan inordnas i efterföljande block eller med hjälp av kedjebaserad allokering. 5