Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /www/webvol34/an/96qmbdpibm1sspm/danielliljeberg.se/public_html/blog/wp-content/mu-plugins/gkphp.php on line 1
X86 « Categories « Daniel Liljeberg

Arkiv för ‘x86’ kategori

Warning: Use of undefined constant archives - assumed 'archives' (this will throw an Error in a future version of PHP) in /www/webvol34/an/96qmbdpibm1sspm/danielliljeberg.se/public_html/blog/wp-content/themes/cordobo-green-park-2/archive.php on line 32

Warning: Use of undefined constant page - assumed 'page' (this will throw an Error in a future version of PHP) in /www/webvol34/an/96qmbdpibm1sspm/danielliljeberg.se/public_html/blog/wp-content/themes/cordobo-green-park-2/archive.php on line 32

Warning: A non-numeric value encountered in /www/webvol34/an/96qmbdpibm1sspm/danielliljeberg.se/public_html/blog/wp-content/themes/cordobo-green-park-2/archive.php on line 32

Warning: A non-numeric value encountered in /www/webvol34/an/96qmbdpibm1sspm/danielliljeberg.se/public_html/blog/wp-content/themes/cordobo-green-park-2/archive.php on line 32
class="post-212 post type-post status-publish format-standard hentry category-x86">

It’s alive! Hur en PC bootar

21 juni, 2011

Introduktion

För att en PC skall kunna boota så är det en hel del kriterier som måste uppfyllas. En nyckelkomponent i hela proceduren är BIOS (Basic Input/Output System) som sitter på moderkortet. Men magin bakom hur BIOS lyckas förstå att den skall boota en enhet och hur den därifrån lyckas starta operativsystem som Windows, Linux osv. är egentligen inte så magisk. Det styrs istället av strikt uppsatta regler för hur bootprocessen skall gå till och villkor som måste uppfyllas. Även om det skiljer en del mellan olika BIOS osv så går vi här igenom själva grunderna i hur en PC faktiskt bootar.

Dags att stiga upp

Ström

När du trycker på strömbrytaren så skickas en signal till moderkortets styrkrets som startar strömförsörjningen. Då det tar ett tag innan nätaggregatet kan leverera en pålitlig spänning till komponenterna så skickar styrkretsen en så kallad reset signal till processorn. Enkelt förklarat kan man säga att denna signal skickas för att processorn skall vänta på att systemet är redo för att processorn skall börja jobba. Denna signal är samma signal som skickas när du trycker på reset knappen på din dators chassi. Om du någon gång hållit inne denna knapp så kanske du märkt att datorn inte startar om förens du släpper upp knappen igen. När strömmen är stabil skickas signalen “PWR OK” från nätaggregatet. Denna signal skickas sedan kontinuerligt ifrån nätaggregatet så länge inga fel upptäcks. När denna signal mottas så kan bootprocessen börja.

BIOS

För att processorn, som för tillfället inte har några instruktioner i minnet att exekvera, skall kunna göra något produktivt så är den förprogrammerad att leta efter systemets BIOS på en specifik plats i systemminnet. Positionen för detta är oftast 0xFFFF, vilket är 16 byte ifrån slutet av systemminnet. Genom att lägga BIOS där så garanterar man att processorn vet var den skall börja exekvera. Dock så är det svårt att passa in hela BIOS16 byte. Detta har man löst genom att på positionen 0xFFFF lägga en enda instruktion, en “jump” instruktion som talar om för processorn var den kan hitta den riktiga BIOS koden. På detta sätt kan den faktiska koden för BIOS växa utan att skapa kompatibilitetsproblem och processorn vet alltid var den skall leta för att hitta sin första instruktion.

BIOS utför nu något som kallas POST. POST står för Power On Self Test och utför en del kontroller så som att varje komponent har rätt spänning, att minnet inte är korrupt etc. Om några fatala fel upptäcks så avbryts bootprocessen. POST kan också returnera felkoder i form av så kallade “beep codes”. Dessa kan skilja mellan olika tillverkare av BIOS men är mycket användbara när det gäller att precisera fel som hindrar datorn från att boota.

Även andra komponenter i datorn så som ljudkort, HDD, grafikkort, tv-kort osv är också försedda med egna små BIOS program. BIOS söker nu upp dessa komponenter och kör deras BIOS program. Först ut brukar grafikkortet vara och dess BIOS brukar återfinnas på 0xC000. Detta initierar grafikkortet. På samma sätt körs sedan de andra komponenternas BIOS.

Nu när grafikkortet är initierat så har BIOS möjligheten att rita till skärmen och gör nu ett antal ytterligare tester och skriver ut fel den hittar på skärmen. Du har kanske sett meddelande som klagar på att du inte har ett tangentbord eller mus inpluggad någon gång. Det meddelandet genereras av BIOS här.

BIOS gör nu en kontroll över vilken typ av hårdvara som finns i systemet. Automatiska HDD parametrar sätts och logiska enheter som COM och LPT portar namnges.

There’s no place like… 0x7C00

Bootsektor

Nu kommer BIOS att leta efter vad som kallas bootsektor på någon av de anslutna enheterna. Bootsektorn innehåller kod för att boota ifrån enheten och exempelvis starta ditt operativsystem (OS). Vilka enheter som kontrolleras ställs in i BIOS. Vanligen kontrolleras dina HDD’s och sedan andra enheter. Den första enheten i listan som innehåller en bootsektor som uppfyller kraven för att kunna bootas kommer att vara den enhet som bootas.

Jag nämnde tidigare att den till synes magiska uppstarten av en dator egentligen är hårt styrd. Bootsektorn måste därför uppfylla ett antal kriterier för att BIOS skall kunna ladda och köra den.

  • Måste ligga i första sektorn på enheten
  • Måste vara exakt 512 byte
  • Måste sluta med 0x55 och 0xAA på position 511 och 512

Om BIOS hittar en sektor som uppfyller dessa krav så laddas den in i minnet på en specifik position, 0x7C00. Registret dl sätts till numret på den enhet som bootsektorn laddas ifrån. Första HDD’n har 0x8000 och den första floppydriven har nummer 0x0000. Om ingen enhet innehåller en bootsektor så rapporterar BIOS ett fel i stil med “Disk boot failure”.

En massa register sätts nu till 0 och processorn hamnar i vad som kallas “real mode”. BIOS ger därefter processorn instruktionen att utföra ett “jump” till 0x7C00 vilket för över kontrollen till koden som laddades ifrån bootsektorn.

Då bootsektorn endast är 512 byte så kan den inte innehålla ofantliga mängder kod. Istället brukar den bara ansvara för att ladda och exekvera mer kod. För MS-DOS laddas tex IO.SYS som sedan laddar och exekverar mera data.

Master Boot Record

Då hårddiskar kan partitioneras i flera partitioner som alla kan innehålla bootbara OS så leder resonemanget ovan till ett problem. Då olika OS kan kräva olika bootloaders för att kunna boota så måste vi byta ut bootloadern i bootsektorn varje gång vi skall boota ett annat OS.

För att komma runt detta så ligger inte den riktiga bootloadern i den första sektorn på en HDD. Istället återfinns där något som kallas Master Boot Record (MBR). Det hanteras dock precis likadant av BIOS. Det vill säga, det laddas in på positionen 0x7C00 och slutar på 0x55AA. Exekverbar kod återfinns mellan offset offset 0x0000 0x01bd. Men förutom att endast innehålla exekverbar kod som bootsektorn gör så innehåller MBR även en partitionstabell med information om partitionerna som finns på HDD’n. Dessa entries för de fyra primära partitionerna är på 16 byte var och finns på offset 0x01BE 0x01FD följt av en signatur på två byte 0x01FE 0x01FF.

Formen på en entry är

Offset

Storlek (byte)

Förklaring

0x00

1

Boot indikator (0x80 = bootbar, 0x00 = icke bootbar)

0x01

1

Första “Head” nummer

0x02

2

Första cylinder nummer (10 bits) och sektor (6 bits)

0x04

1

“Descriptor” (Typ av partition/filsystem)

0x05

1

Avslutande “Head” nummer

0x06

2

Avslutande cylinder och sektor nummer

0x08

4

Starting Sector (relativt till HDD’ns början)

0x0C

4

Antal sektorer i partitionen

 

Bootloadern för en partition återfinns i den första sektorn av en partition och är på samma form som en bootsektor. MBR kontrollerar vilken partition som är aktiv, och laddar sedan in dess bootsektor på plats 0x7C00 och instruerar processorn att göra ett “jump” till den positionen. Notera att MBR tidigare laddades in på 0x7C00. MBR måste således flytta sig själv ur vägen innan bootsektorn laddas.

Detta gör det möjligt för flera olika OS att ligga i olika partitioner på samma fysiska HDD och kunna laddas med olika bootloaders.

Avslutning

I nästa artikel skall vi se hur detta fungerar i praktiken och försöka oss på att följa dessa “regler” för att få en PC att boota utifrån en bootsektor vi själva skriver.

Flattr this!