Umschalten in Protected Mode

Aus Lowlevel
Wechseln zu: Navigation, Suche

So einfach ist das! In der GDT wird ein Daten-, sowie Code-Deskriptor auf die ganzen 4 möglichen GByte Arbeitsspeicher eingerichtet. Heutzutage verwenden dank Paging alle OS ein solches, sogenanntes flaches Speichermodell. Das heißt, dass man von nun an nur noch mit 32-Bit Offsets hantieren und sich nicht mehr mit Segmenten herumschlagen muss.

Mehr Infos und eine zweite Art in den Protected Mode umzuschalten findet man im Protected Mode Tutorial von Tee Jay, sowie dem, schon etwas älteren, Tutorial der FH-Zwickau.


Wichtig bei diesem Code ist es, selbst noch die org-Anweisung auf die Startadresse des Codes anzupassen!! <asm>;;; Ein kleines Beispiel, wie man in den 32-Bit Protected Mode wechselt

Bei Fragen kann man sich einfach an die ICQ-Nummer 338-417-614 wenden.

[BITS 16] org 0x0000 ; Addiert zu allen Offsets die Start-Adresse dieses Codes

cli ; Interrupts ausschalten lgdt [gdtr] ; GDT Pointer laden

mov eax,cr0 ; In PMode wechseln, indem das niedrigste or al,1 ; Steuerungsbit von cr0 geändert wird mov cr0,eax ; muss über Umweg über ein anderes Register gemacht werden

jmp codesel:PMode ; FarJump zu einer 32-Bit PMode Funktion

[BITS 32] PMode: mov ax,datasel ; Segmentregister laden mov ds,ax mov ss,ax mov esp,0x90000 ; Stack aufsetzen

jmp $ ; Endlosschleife, wird durch weiteren Code ersetzt


== GDT == ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

gdtr: ; Desktiptortabelle

  dw gdt_end-gdt-1		; Limit
  dd gdt			; Basisadresse

gdt:

  dd 0,0			; Null-Deskriptor

codesel equ $-gdt

  dw 0xFFFF			; Segmentgrösse 0..15
  dw 0x0000			; Segmentadresse 0..15
  db 0x00			; Segmentadresse 16..23
  db 0x9A			; Zugriffsberechtigung und Typ
  db 0xCF			; Zusatzinformationen und Segmentgrösse 16...19
  db 0x00			; Segmentadresse 24..31

datasel equ $-gdt

  dw 0xFFFF			; Segmentgrösse 0..15
  dw 0x0000			; Segmentadresse 0..15
  db 0x00			; Segmentadresse 16..23
  db 0x92			; Zugriffsberechtigung und Typ
  db 0xCF			; Zusatzinformationen und Segmentgrösse 16...19
  db 0x00			; Segmentadresse 24..31

gdt_end:</asm>