1. 程式人生 > >x86CPU 實模式 保護模式 傻傻分不清楚? 基於Xv6-OS 分析CR0 寄存器

x86CPU 實模式 保護模式 傻傻分不清楚? 基於Xv6-OS 分析CR0 寄存器

獲取 ack oot pop -o sdn 行程 model 保護

基於Xv6-OS 分析CR0 寄存器


之前一直認為暈乎乎的...啥?什麽時候切換real model,怎麽切換,為什麽要切換?

-------------------------------------------------------------------------------------------------------------------------------------------


以下這段代碼來自Xv6的boot/boot.S

技術分享

這就是CPU real model 和 protected model的“分水嶺”

根源在於控制這兩種執行模式的寄存器——CR0 發生的變化

在Xv6裏面這樣的CPU模式的切換發生的很早,在boot.s幾條匯編指令執行之後立刻切換。切換之後,CPU便以protected model執行


以下是CR0的layout

技術分享


再看這段代碼(CR0_PE_ON在boot.S開頭定義了。值為1)

技術分享

意思就是把cr0寄存器的最低位置為1,So.... PE經歷這段過程之後就進入到了protected model

PE: CR0的0位是啟用保護位(protection enable)。

當設置該位的時候即開啟了保護模式。系統上電復位的時候該位默覺得0,於是是實模式 real model. PE置1的保護,實質上是開啟段級保護,就是僅僅進行了分段,沒有開啟分頁機制。假設要開啟分頁機制須要同一時候置位PE和PG


事實上搞清楚以上的東東,就明確了。什麽時候會開啟保護模式,怎麽開啟的問題


接著繼續看看CR0裏面還有哪些“寶貝”


技術分享



PG: 分頁標誌位。

當設置該位時開啟分頁機制。當復位的時候則禁止分頁機制,此時全部的線性地址等於物理地址。

在開啟這個標誌位之前必須已經或者同一時候開啟PE. 啟用分頁的條件就是PE PG同一時候為1


WP:(intel 80486以上的機器會有)該位是寫保護位, write protection bit. 該位為1時,CPU會禁止用戶特權級為0(超級用戶)向read only page寫入數據。可是復位的時候同意。這個標誌位主要與 COW(copy on write)有關系.


NE:number error 協處理器錯誤,為1時。啟用x87協處理器的內部報告機制,假設是0,就是用PC形式的x87協處理器的報告機制。(感覺眼下我不會接觸這東東。。)



當改變PE PG時候,必須小心。

僅僅有當運行程序至少有部分代碼和數據在線性地址空間和物理地址空間中具有同樣地址時,我們才幹改變PG位的設置。此時這部分具有同樣地址的代碼在分頁和未分頁的世界起著橋梁作用。不管是否開啟分頁機制。這部分代碼都具有同樣的地址。另外,開啟分頁PG=1之前。必須先刷新TLB。在改動了PG之後。必須使用一個長跳轉語句,以刷新處理器運行管道中已經獲取的不同模式下的不論什麽命令。


ET: 系統中有80387協處理器,置為1,有一個80287或者沒有,置為0


TS EM MP 都浮點數處理有關系







技術分享





x86CPU 實模式 保護模式 傻傻分不清楚? 基於Xv6-OS 分析CR0 寄存器