2013-07-03 52 views
1

x64架構上實模式和保護模式之間的區別是什麼?我試圖爲Linux內核製作一個自定義的引導加載程序。如何在程序集中啓用保護模式?x64架構上實模式和保護模式的區別

+1

閱讀[英特爾®64和IA-32架構軟件開發人員手冊,卷3:系統編程指南](http://www.intel.com/content/www/us/en/processors/architectures-software-顯影劑manuals.html);或[AMD64體系結構程序員手冊第2卷:系統編程](http://developer.amd.com/resources/documentation-articles/developer-guides-manuals/)。 –

回答

0

參見osdev real mode,protected mode

由BIOS初始化的CPU以實模式啓動。啓用保護模式允許使用實模式無法訪問的所有4GB內存。但是,它會阻止您使用大部分BIOS中斷,因爲這些中斷在實模式下工作(除非您還編寫了V86監視器)。

在切換到保護模式之前,您必須禁用中斷,可能啓用A20線路,並使用適用於代碼,數據和堆棧的段描述符加載全局描述符表。

CPU處於實模式還是保護模式由CR0或MSW寄存器的最低位定義。

這個例子加載一個描述符表到處理器的寄存器GDTR,然後設置CR0的最低位:

cli   ; disable interrupts 
lgdt [gdtr] ; load GDT register with start address of Global Descriptor Table 
mov eax, cr0 
or al, 1  ; set PE (Protection Enable) bit in CR0 (Control Register 0) 
mov cr0, eax 

; Perform far jump to selector 08h (offset into GDT, pointing at a 32bit PM code segment descriptor) 
; to load CS with proper PM32 descriptor) 

JMP 08h:PModeMain 

; [...] 

PModeMain: 
; load DS, ES, FS, GS, SS, ESP. 

這需要你的保護模式。
之後,您可以跳轉到C或程序集中的內核代碼。