2014-04-09 43 views

cevap

7

64 bit kapabiliteleri etkinleştirmek için, CPU'yu Uzun Mod'a geçirmelisiniz.

64 bit x86 işlemci (x86-64) Uzun Mod girmek için:

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

Resmi belgeler: [Intel® 64 ve IA-32 Mimarileri Yazılım Geliştirici El Kitabı, Cilt 3A: Sistem Programlama Kılavuzu:] (https://www.intel.com/content/www/us/en/architecture-and- teknoloji/64-ia-32-mimarileri-yazılım-geliştirici-vol-3a-part-1-manual.html) "Bölüm 9.8.5 IA-32e Modunu Başlatma" –

2

OSDev düşük seviyeli x86 üzerinde bilgi (ve diğer mimarileri üzerinde biraz) için iyi bir kaynaktır.

hem yapılabilir uzun moduna giriş Uzun Modu

Girme: Örneğin, this article Uzun modu ve nasıl girmek için oldukça iyi bir writeup korumalı modundan doğrudan gerçek modundan hem vardır Gerçek mod ve korumalı mod, Ancak, yalnızca korumalı mod Intel ve AMD64 kılavuzlarında ele alınmıştır. Erken AMD belgeleri, bu işlemin gerçek modda kuyusu gibi çalıştığını açıklar. Eğer 64-bit moduna doğrudan gitmek isterseniz

2

, böyle bir şey yapabilirsiniz: Yukarıdaki kod

%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. 

Zaten kurulum sayfası tabloları ve Küresel tanımlayıcı tablosu olmasını gerektirir.