U kunt niet rechtstreeks overstappen naar de beschermde modus met een enkele assemblage -instructie. Het is een multi-stappen proces waarbij de Global Descriptor Table (GDT) wordt geladen en de PE-vlag in het Control Register CR0 instelt. Hier is een vereenvoudigd voorbeeld dat de belangrijkste stappen in de montage aantoont (ervan uitgaande dat u een vooraf gedefinieerde GDT hebt geladen op een specifiek adres):
`` `Assemblage
.model plat, stdcall
.stack 100h
.gegevens
Gdt_ptr dd gdt_table; Aanwijzer naar de GDT
; ... (definieer hier uw GDT -structuur)
.code
Hoofdproces
; 1. Laad het GDT -register (GDTR) met het adres van uw GDT
LGDT [GDT_PTR]
; 2. Stel het PE -bit in in CR0 -register
MOV EAX, CR0
of eax, 1; Stel bit 0 (PE -vlag) in op 1
MOV CR0, EAX
; 3. Spring naar een codesegment gedefinieerd voor beschermde modus
jmp far ptr protected_mode_entry
; ... (Uw code voor beschermde modus begint hier)
protected_mode_entry Proc
; ...
ret
protected_mode_entry endp
Hoofd endp
Eind Main
`` `
Verklaring:
1. `LGDT [GDT_PTR]`: Deze instructie laadt het Global Descriptor Table Register (GDTR) met het adres van uw GDT. De GDT bevat descriptoren voor alle segmenten in beschermde modus, inclusief codesegmenten, gegevenssegmenten en stack -segmenten.
2. `of eax, 1`: Dit stelt de PE (Protection Enable) bit in het CR0 -register in. Deze bit regelt de bewerkingsmodus van de CPU:0 voor echte modus, 1 voor beschermde modus.
3. `JMP FAR PTR Protected_Mode_Entry`: Deze instructie voert een versprong uit, waarbij de CPU wordt overgebracht naar de beschermde modus. De `far ptr` geeft aan dat het een sprong naar een nieuw segment is, essentieel voor de modusschakelaar.
Belangrijke overwegingen:
* GDT -instelling: U moet uw GDT definiëren voordat u deze code uitvoert. De GDT moet descriptoren bevatten voor alle segmenten die u in de beschermde modus wilt gebruiken.
* beschermde moduscode: Na de sprong moet uw code worden geschreven voor de beschermde modus. Dit omvat het gebruik van segmentselectors voor het aanpakken van geheugen en het gebruik van verschillende instructies voor geheugenbeheer.
* ECHTE MODE BOOT: Deze code veronderstelt dat u al in de echte modus (16-bits modus) bent. U moet uw systeem opstarten in de echte modus voordat u de beschermde modus invoert.
Onthoud: Dit is een fundamenteel voorbeeld voor demonstratiedoeleinden. U moet het aanpassen aan uw specifieke vereisten, waaronder:
* Een complete en geschikte GDT definiëren.
* Het instellen van de interrupt -descriptor -tabel (IDT).
* Geproteerde modus geheugenbeheer implementeren met segmentatie en paging.
* Schrijven van beschermde modus-specifieke code voor taken die u moet uitvoeren.
U kunt meer uitgebreide informatie vinden over programmering met beschermde modus in de Intel- of AMD -processorhandleidingen. |