2014-04-09 20 views

Odpowiedz

7

Aby umożliwić 64-bitowe operacje, należy przełączyć CPU na tryb Long.

Aby wprowadzić trybie Long na procesorze x86 64-bit (x86-64):

If paging is enabled, disable paging. 
If CR4.PAE is not already set, set it. 
Set IA32_EFER.LME = 1. 
Load CR3 with a valid PML4 table. 
Enable paging. 
At this point you will be in compatibility mode. A far jump may be executed to switch to long mode. However, the offset must not exceed 32-bit. 
+0

Oficjalna dokumentacja: [Podręcznik oprogramowania Intel® 64 i IA-32 Architectures, tom 3A: Podręcznik programowania systemu:] (https://www.intel.com/content/www/us/en/architecture-and- technology/64-ia-32-architects-software-developer-vol-3a-part-1-manual.html) "Rozdział 9.8.5 Inicjowanie trybu IA-32e" –

2

OSDev jest dobrym źródłem informacji na temat niskiego poziomu x86 (i trochę na innych architekturach). Na przykład, this article jest całkiem dobry writeup trybu długo i jak do niego wejść, zarówno w trybie chronionym i bezpośrednio w trybie rzeczywistym:

Wprowadzanie trybie Long

Wprowadzenie trybu długo można zarówno zrobić z tryb rzeczywisty i tryb chroniony, jednak tylko tryb chroniony jest uwzględniony w podręcznikach Intela i AMD64. Wczesna dokumentacja AMD wyjaśnia, że ​​ten proces działa z trybu rzeczywistego, jak również dobrze .

2

Jeśli chcesz, aby przejść bezpośrednio do trybu 64-bitowego, można zrobić coś takiego:

%xdefine PML4_BASE 0x70000  ; Address of PML4-table. 
%xdefine CR0_PE  1 << 0 
%xdefine CR0_PG  1 << 31 
%xdefine CR4_PAE 1 << 5 
%xdefine CR4_PGE 1 << 7 
%xdefine EFER_LME 1 << 8 

mov eax, CR4_PAE | CR4_PGE  ; Set PAE- (Physical Address Extensions) and 
mov cr4, eax     ; PGE- (Page Global Enable). 
mov eax, PML4_BASE    ; Address of PML4. 
mov cr3, eax     ; Point CR3 to PML4. 
mov ecx, 0xC0000080   ; EFER MSR selector. 
rdmsr       ; Read from model specific register. 
or eax, EFER_LME    ; Set LME (Long Mode Enable). 
wrmsr       ; Write to model specific register. 
mov ebx, cr0     ; Get CR0. 
or ebx, CR0_PG | CR0_PE  ; Set PG (Paging) and PE (Protection Enabled). 
mov cr0, ebx     ; Set flags to CR0. 
lgdt [GDT.ptr]     ; Load global descriptor table. 
jmp GDT.code_0:long_mode_entry ; Jump to long mode. 

Powyższy kod wymaga, że ​​masz już tabel stronę konfiguracji i Global Descriptor Table.