Long Mode — Änderungen 5432 → 5436

Zeile 1: Zeile 1:
 
{{Achtung|Text=Der Artikel wird zur Zeit bearbeitet. Bitte bearbeite diesen Artikel nicht! Es kann zu Darstellungsproblemen während des Betrachtens des Artikels kommen. [[Benutzer:SHyx0rmZ|SHyx0rmZ]] 12:14, 7. Aug. 2009 (CEST)}}
 
{{Achtung|Text=Der Artikel wird zur Zeit bearbeitet. Bitte bearbeite diesen Artikel nicht! Es kann zu Darstellungsproblemen während des Betrachtens des Artikels kommen. [[Benutzer:SHyx0rmZ|SHyx0rmZ]] 12:14, 7. Aug. 2009 (CEST)}}
  
−
Der '''Long Mode''' ist ein CPU-Modus neuerer CPUs, in dem erstmals 64-Bit-Allzweckregister zur Verfügung stehen. Wie auch beim [[Protected Mode]] starten Prozessoren, die diesen Modus unterstützen, aus Kompatibilitätsgründen zunächst im [[Real Mode]] mit deaktiviertem [[A20-Gate]].
+
Der '''Long Mode''' ist ein CPU-Modus neuerer CPUs, in dem erstmals [[Register#Allzweckregister_2|64-Bit-Allzweckregister]] zur Verfügung stehen. Wie auch beim [[Protected Mode]] starten Prozessoren, die diesen Modus unterstützen, aus Kompatibilitätsgründen zunächst im [[Real Mode]] mit deaktiviertem [[A20-Gate]].
  
−
==Eigenschaften==
+
== Eigenschaften ==
 
* Address-/Registerbreite beträgt 64 Bit
 
* Address-/Registerbreite beträgt 64 Bit
 
* Viele neue Register (z.B. R8-R15, CR8-CR15, ...)
 
* Viele neue Register (z.B. R8-R15, CR8-CR15, ...)
 
* ...
 
* ...
  
−
==Wie überprüfe ich, ob die CPU den Long Mode unterstützt?==
+
== Überprüfung der Unterstützung ==
 
CPUs, die den Long Mode unterstützen, setzen bei einem Aufruf der [[CPUID#Funktion_0x8000_0001|CPUID Funktion 0x80000001]] das [[CPUID#EDX_-_Erweiterte_Featureflags|Long-Mode-Capable-Bit (Bit 29)]] im EDX-Register auf 1. Sicherheitshalber sollte man auch noch überprüfen, [[Physical Address Extension|Physical Address Extensions]] unterstützt werden.
 
CPUs, die den Long Mode unterstützen, setzen bei einem Aufruf der [[CPUID#Funktion_0x8000_0001|CPUID Funktion 0x80000001]] das [[CPUID#EDX_-_Erweiterte_Featureflags|Long-Mode-Capable-Bit (Bit 29)]] im EDX-Register auf 1. Sicherheitshalber sollte man auch noch überprüfen, [[Physical Address Extension|Physical Address Extensions]] unterstützt werden.
  
Zeile 26: Zeile 26:
 
</asm>
 
</asm>
  
−
==Wie schalte ich den Long Mode um?==
+
== 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 0xC00000080''' 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 ([[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 0xC00000080''' 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.
  
 
{{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.
 +
 +
<asm>
 +
mov eax, cr4            ; CR4 einlesen
 +
or eax, 0x20            ; Physical Address Extension-Bit setzen
 +
mov cr4, eax            ; CR4 beschreiben
 +
 +
; ~~~~~~~~~            ; Pagingstrukturen initialisieren
 +
 +
mov eax, PML4_ADDRESS  ; Die Adresse des Page Map Level 4 hier eintragen
 +
mov cr3, eax
 +
 +
mov ecx, 0xC0000080    ; Wir brauchen Zugriff aus das MSR-Register 0xC0000080
 +
rdmsr                  ; MSR-Register einlesen
 +
or eax, 0x00000100 ; Long Mode einschalten
 +
wrmsr                  ; MSR-Register beschreiben
 +
 +
mov eax, cr0            ; CR0 einlesen
 +
or eax, 0x80000000      ; Das Paging-Bit setzen
 +
mov cr0, eax         ; CR0 beschreiben, ab jetzt sind wir im Long Mode
 +
 +
db 0xEA                ; Das ist ein far jmp, ich bekomms nit anders hin ><
 +
dd kernel.longmode      ; Die neue Adresse für EIP/RIP
 +
dw 0x30                ; Das 64-Bit Code Segment
 +
 +
[bits 64]
 +
kernel.longmode: ; Jetzt führen wir auch endlich 64-Bit Code aus
 +
jmp $                  ; Endlosschleife xD
 +
</asm>
 +
 +
== Es geht auch anders ==
 +
{{Hinweiss|Text=Hier folgt in Kürze eine Beschreibung, wie man den Long Mode auch direkt vom Real Mode aus aktivieren kann.}}
  
 
==Links==
 
==Links==