Umschalten in Protected Mode

Aus Lowlevel
Wechseln zu:Navigation,

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, genannt flaches, Speichermodell. Das heisst von nun an muss man nur noch mit 32-Bit Offsets hantieren und sich nicht mehr mit Segmenten herumschlagen.

<asm>;;; Ein kleines Beispiel, wie man in den 32-Bit Protected Mode wechselt

Bei Fragen kann man sich einfach an stefan.marcik@web.de oder
an die ICQ-Nummer 338417614 wenden.

[BITS 16] 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


== 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> © by Stefan Marcik