Long Mode — Änderungen 6437 → 8308

Zeile 25: Zeile 25:
  
 
== Aktivierung des Long Mode ==
 
== Aktivierung des Long Mode ==
−
Um in den Long Mode umschalten zu können, muss erst einmal der [[Protected Mode]] aktiviert werden ([[Long_Mode#Es_geht_auch_anders|Es geht auch anders]]). Eine weitere Voraussetzung ist, dass das '''[[Physical Address Extension]]'''-Bit (Bit 5) im [[Control_Register#CR4|CR4]] Register gesetzt und '''[[Paging]]''' aktiviert ist. Jetzt kann der Long Mode mit dem Setzen des LME-Bits (Bit 8) im '''MSR 0xC0000080''' aktiviert werden. Im eigentlichen Long Mode befindet man sich aber erst, wenn man in ein 64-Bit-Code-Segment wechselt, das im Vergleich zu den 32-Bit-Code-Segmenten in seinem Descriptor das L-Bit (Bit 21) im 2. DWord gesetzt hat.
+
Um in den Long Mode umschalten zu können, muss erst einmal der [[Protected Mode]] aktiviert werden. Eine weitere Voraussetzung ist, dass das '''[[Physical Address Extension]]'''-Bit (Bit 5) im [[Control_Register#CR4|CR4]] Register gesetzt und '''[[Paging]]''' aktiviert ist. Jetzt kann der Long Mode mit dem Setzen des LME-Bits (Bit 8) im '''MSR 0xC0000080''' aktiviert werden. Im eigentlichen Long Mode befindet man sich aber erst, wenn man in ein 64-Bit-Code-Segment wechselt, das im Vergleich zu den 32-Bit-Code-Segmenten in seinem Descriptor das L-Bit (Bit 21) im 2. DWord gesetzt hat. Die entsprechenden Einträge in der [[Global Descriptor Table|GDT]] sind natürlich vorher vorzunehmen.
  
 
{{Achtung|Text=Das Paging funktioniert im Long Mode ein wenig anders als im Protected Mode.}}
 
{{Achtung|Text=Das Paging funktioniert im Long Mode ein wenig anders als im Protected Mode.}}
  
−
Sobald man diesen Beispielcode um ein paar Pagingstrukturen erweitert, aktiviert er den Long Mode.
+
Dieser Beispielcode zeigt beispielhaft, wie man denn Long Mode aktiviert. Die hier verwendeten Pagingstrukturen sind nur provisorisch angedacht und sollten möglichst durch eigene ersetzt werden, sonst wird das Ganze ganz schnell nicht mehr ganz so schön.
  
 
<asm>
 
<asm>
Zeile 36: Zeile 36:
 
mov cr4, eax            ; CR4 beschreiben
 
mov cr4, eax            ; CR4 beschreiben
  
−
; ~~~~~~~~~            ; Pagingstrukturen initialisieren
+
mov edi, 0x300000      ; Pagingstrukturen liegen bei 0x300000
  
−
mov eax, PML4_ADDRESS  ; Die Adresse des Page Map Level 4 hier eintragen
+
mov eax, 0x30100F      ; Eintrag für die Page Directory Pointer Table
 +
stosd
 +
mov ecx, 0x03FF
 +
xor eax, eax
 +
rep stosd              ; Rest mit Nullen auffüllen
 +
 
 +
mov eax, 0x30200F      ; Eintrag für die Page Directory Table
 +
stosd
 +
mov ecx, 0x03FF
 +
xor eax, eax
 +
rep stosd              ; Rest mit Nullen auffüllen
 +
 
 +
mov ecx, 0x0200
 +
mov esi, 0x008B        ; Die Attribute für die Einträge im Page Directory
 +
 
 +
map.loop:              ; Hier werden die ersten 512 MiB Identity-Mapped
 +
mov eax, esi            ; Page eintragen
 +
stosd
 +
xor eax, eax            ; Jeder Eintrag besteht aus 8 Byte, also die oberen 4 auffüllen
 +
stosd
 +
add esi, 0x200000      ; Und zwar mit 2 MiB Pages
 +
sub ecx, 1
 +
jnz map.loop
 +
 
 +
mov eax, 0x300000      ; Die Adresse des Page Map Level 4 hier eintragen
 
mov cr3, eax
 
mov cr3, eax
  
Zeile 57: Zeile 81:
 
jmp $                  ; Endlosschleife xD
 
jmp $                  ; Endlosschleife xD
 
</asm>
 
</asm>
−
 
−
== Es geht auch anders ==
 
−
{{Hinweis|Text=Hier folgt in Kürze eine Beschreibung, wie man den Long Mode auch direkt vom Real Mode aus aktivieren kann.}}
 
  
 
==Links==
 
==Links==