Real mode

Uit Wikipedia, de vrije encyclopedie
Ga naar: navigatie, zoeken

Real mode is de toestand van een processor van de x86-architectuur waarin de oorspronkelijke 8086 wordt gesimuleerd.

In feite draait een 8086 altijd in real mode. De benaming 'real mode' werd pas geïntroduceerd met de komst van de 80286, omdat die ook in protected mode kon draaien.

Adressering door de 8086[bewerken]

De 8086 heeft 20 adreslijnen en in real mode kan er dus 1 MiB geheugen geadresseerd worden. De registers zijn echter slechts 16 bits groot. Om het geheugen te kunnen adresseren, worden er twee waarden van 16 bits samengevoegd: segment en offset. De eerste van deze waarden bevindt zich in een segmentregister. Deze waarde wordt 4 bits verschoven waarna de offset erbij wordt opgeteld.

Door deze architectuur kan een programma op een willekeurige plaats in het geheugen worden gezet, mits op een veelvoud van 16. Men hoeft er alleen nog maar voor te zorgen dat de segmentregisters de juiste waarde hebben.

Adressering door de 80286[bewerken]

De 80286 heeft 24 adreslijnen en kan dus 16 MiB adresseren. De 15 MiB extra geheugen werd extended memory genoemd. In real mode is deze adresruimte niet toegankelijk, zodat de protected mode nodig werd. Toch is het mogelijk in real mode een klein deel van het extended memory te adresseren, en wel door een hoge waarde in een segmentregister te zetten. Men komt dan tot FFFF0+FFFF=10FFEF. Een 8086 zou in dat geval wraparound vertonen, zodat 0FFEF wordt geadresseerd. Sommige programma's die waren gemaakt voor de 8086 draaiden daardoor niet op de 80286, en om dat probleem te verhelpen werden de meeste computers voorzien van een A20-gate, waarmee adreslijn 20 steeds laag (0) werd gemaakt. Het spreekt vanzelf dat deze gate in protected mode buiten werking werd gesteld.

Segmentdescriptors[bewerken]

In werkelijkheid is de werking van de segmentregisters op de 80286 wat ingewikkelder. Er zijn namelijk segmentdescriptors die (onder andere) een waarde van 24 bits kunnen bevatten. Elke keer als een segmentregister geladen wordt, wordt de inhoud vier bits verschoven naar de segmentdescriptor gekopieerd. Wordt het geheugen geadresseerd, dan wordt het segmentregister genegeerd, in plaats daarvan wordt de segmentdescriptor gebruikt.

Deze constructie opent interessante mogelijkheden. Zou het mogelijk zijn een hoge waarde in de segmentdescriptor te zetten, dan wordt het mogelijk in real mode het volledige extended geheugen te adresseren. Maar helaas heeft een programma niet direct toegang tot een segmentdescriptor.

Bij het opstarten van de processor geldt echter een uitzondering. De 8086 begint, na het ontvangen van een resetsignaal, op adres F000:FFF0 (segment F000, offset FFF0), dus op FFFF0. Dat is op 16 bytes na het hoogste adres. De 80286 begint na reset op FFFFF0, en dat in real mode. Dat kan doordat er op dat moment een illegale waarde in de segmentdescriptor staat, namelijk FF0000. Na de eerste normale sprongopdracht, waarbij het segmentregister CS geladen wordt, is de processor definitief beperkt tot de geheugenruimte van de 8086.

Een andere ontsnappingsmogelijkheid geldt met de instructie LOADALL. Dit is een instructie die door Intel niet gedocumenteerd is en die het mogelijk maakt alle registers onafhankelijk van elkaar te laden. De instructie maakt het mogelijk in real mode iedere willekeurige waarde in een segmentdescriptor te zetten.