2016-05-15 3 views
2

Ich las etwas Code von CoreBoot und das erste, was es tut, ist im geschützten Modus eingeben, das ist normal für einen Intel x86 Bootstrapper, danach lädt und ruft die Nutzlast (in diesem Fall Seabios) , seabios führt alle erforderlichen Initialisierungsprozeduren für die Hardwaregeräte durch, einige dieser Prozeduren müssen im Realmodus ausgeführt werden, und schließlich ruft das BIOS den os Bootstrapper bei 0x7c00 immer im Realmodus auf.Coreboot + SeaBios-Modus-Schalter

Meine Frage und Zweifel ist: An welchem ​​Punkt tritt der Wechsel zwischen geschütztem Modus und Realmodus (wieder) auf?

Ist der letzte Prozessormodus: großer Realmodus?

Dank

+0

Seabios entspricht einer typischen 386-Klasse-Maschine mit einem Legacy-BIOS. Es versetzt die Maschine in einen unrealistischen Modus (16 Bit) und springt zu 0x0000: 0x7c00, wo es den Boot-Sektor der Platte geladen hat. –

Antwort

0

Ich hatte die gleiche Frage. Gemäß dem Seabios-Ausführungsfluss-Handbuch [https://www.seabios.org/Execution_and_code_flow] ist die letzte Phase des POST die Boot-Phase. Der Aufruf des Bootloaders beginnt mit call_boot_entry(), der farcall16() mit dem Argument "0x07c0" aufruft. farcall16 ruft die Assembly-Funktion transition16 auf, die die CPU zurück in den Real-Modus schaltet und jmp auf "0x07c0" setzt.

+0

Eigentlich beginnt es mit dem Segment als 0x07c0 (beim Booten von Diskette/Festplatte). Vor dem Aufruf von 'call_boot_entry()' normalisiert es das Segment zu einem Segment: Offset-Paar. Das Ergebnis ist ein Segment von 0x0000 in 'bootseg' und 0x7c00 in' bootip'. Zu dem Zeitpunkt, zu dem der Wechsel in den 16-Bit-Real-Modus (eigentlich unreal-Modus) erfolgt ist - ist das BIOS weit auf 0x0000: 0x7c00 gesprungen, was die physikalische Adresse 0x07c00 ist. –

+0

@MichaelPetch mit der Aussage, dass die farcall16 Argument 0x07c0 Ich habe versucht, Dinge zu vereinfachen, um zu beantworten, wo der Übergang von 32 zu 16 Bit stattfindet. Tatsächlich gibt es viele Details, die ich übersprungen habe. – user2921947