| 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, ...) | ||
* ... | * ... | ||
| − | == | + | == Ü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> | ||
| − | == | + | == 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== | ||