# Ontwerp en bouw een besturingssysteem/Werking van de PC/Processormodes

Intel begon in 1971 met de 4-bits processor, en zeven jaar later waren ze al toe aan hun tot dan toe meest succesvolle 8086 16-bit processor. Deze processor werd namelijk in de eerste versies van de succesvolle IBM PC toegepast. De afstamming en de naam van de X86 processor familie begint dus eigenlijk daar. De werking van de huidige processoren is dan ook een afgeleide van die processor.

## Real mode

De huidige 32-bit processoren starten in een toestand genaamd real mode. In deze toestand gedragen ze zich bijna net als de oorspronkelijke 16-bit 8086 processor. De programmacode heeft de beschikking over 20 adreslijnen (dus een geheugenadres van 20 bits) waarmee het een geheugen van maximaal 2$^{20}$ bytes (is 1 MiB) kan gebruiken.
Processoren hebben een word-size (woordgrootte), en dat is de maximale eenheid aan bits waarmee gewerkt kan worden. Grotere waardes kunnen alleen in een combinatie van words worden gebruikt. In real mode gebruiken processoren 16-bits words, en dus kan je daarmee niet meer dan 64 KiB (2$^{16}$ bytes) addresseren. Om toch de volledige 1 MiB te kunnen gebruiken, werd er gebruik gemaakt van zogenaamde segment addressing. Elk geheugenadres bestaat dan uit twee words van 16-bits (genoteerd als segment:offset in hexadecimaal, bijvoorbeeld 0xDEAD:0xBEEF), die vervolgens op de volgende manier bij elkaar worden opgeteld om het uiteindelijke 20-bit adres te vormen:
$({\mbox{segment}}\cdot 16+{\mbox{offset}})\,{\bmod {\,}}2^{16}$
* Notabene Let wel op dat door de manier waarop het adres berekend wordt, er verschillende combinaties van segment:offset adressen mogelijk zijn die op hetzelfde fysieke adres uit komen, zoals bijvoorbeeld 0x0000:0x7C00 (segment 0, offset 0x7C00) en 0x7C0:0x0000 (segment 0x07C0, offset 0) welke beide naar het fysieke adres 0x07C00 verwijzen.
Omdat de computers dus vanwege de terugwaartse compatibiliteit in real mode opstarten, moet de uitgevoerde code zelf zorgen dat ze in protected mode terecht komt.

## Protected mode

Met de introductie van de 16-bits 80286 processor introduceerde Intel ook de protected mode toestand, hoewel deze toestand in de daaropvolgende 32-bits 80386 processor drastisch is gewijzigd. Met deze laatste versie hebben we in de huidige 32-bits processoren nog steeds te maken, alhoewel er tegenwoordig meer mogelijkheden aan zijn toegevoegd.
In protected mode heeft het besturingssysteem toegang tot de volledige 32-bits adresruimte, dus maximaal 4 GiB. Er werden nieuwe technieken voor geheugenbeheer geïntroduceerd, zoals paging, 32-bit segments en meerdere virtuele adresruimtes. Zie het hoofdstuk Geheugen voor meer informatie over het geheugen.
Ook zorgde protected mode (de naam zegt het al) voor meer bescherming van de verschillende toepassingen die op het systeem draaien. Door elke toepassing z'n eigen virtuele adresruimte te geven, lijkt het alsof ze bijna de volledige 4 GiB geheugen kunnen gebruiken, zonder dat ze kunnen interfereren met andere programma's en hun adresruimtes. Ook is het mogelijk bepaalde delen van het geheugen alleen-lezen te maken, of (in de modernere processoren) onuitvoerbaar.

## Virtual 8086 mode

De processor kan eigenlijk maar in één mode tegelijk werken. Omdat de besturingssystemen al snel overschakelden op protected mode, vanwege de grote voordelen, zouden oudere 'real mode' programma's daar niet meer op uitgevoerd kunnen worden. Om dit toch mogelijk te maken werd de Virtual 8086 mode geïntroduceerd. Hiermee kunnen die programma's vaak toch nog uitgevoerd worden, naast protected mode programma's, zonder protected mode feitelijk te verlaten.

## Long mode

De nieuwste mode van de X86 familie van processoren is de Long mode. In deze mode kunnen programma's theoretisch een maximale adresruimte van 2$^{64}$ bytes krijgen, dat is 16 exbibyte (of ruim 16 miljard GiB). In de praktijk, omdat dit voor de tegenwoordige programma's en besturingssystemen veel te veel is, worden de processoren met een kleinere adresruimte gemaakt, bijvoorbeeld 2$^{48}$ bytes.
In long mode kan segmentation niet meer volledig gebruikt worden.