2015-10-20 163 views
2

在x86中,在設置PE位CR0後,我們執行遠程JMP以確保CS/EIP已更改。當我看到在x86的程序員手冊中的邏輯流程,與此對應遠JMP指令(保護模式),我看到這樣的事情:x86從實模式切換到保護模式CPL(當前權限級別)

Set RPL field of CS register to CPL; 

我想,以確保優先級爲0。假設是DPL描述符中也是0,遠端JMP中的選擇器中的RPL也是0.描述符中的C位爲0,所以它是非符合代碼段的情況。該手冊說CPL是CS中的最後兩位。這意味着,在遠的JMP之前,CS應該包含一個最後兩位爲00的值。因此,當我最初處於實模式時,我應該確保CS在I之前具有符合此條件的某個值執行遠遠的JMP? 如果我要重述一下,當我們從實模式切換到保護模式時,CPL是多少?

+1

不錯的問題,順便說一句。當我開始使用這些東西的時候,我想了好幾個月。 – Downvoter

+0

謝謝,cad。儘管如此,我的腦袋正在旋轉着,在你的回覆中嵌入瞭如此多的嵌套信息。我想這可能需要我花幾個月的時間來吸收它們。但在此之前我需要了解很多,因爲我很快就會登上老師的領獎臺。 – Kamalakshi

回答

3

[...]當我們從真實模式切換到保護模式時,CPL是多少?

當真實模式處於活動狀態時,CPL被設置爲適合真實模式(我猜測它爲零)的「需求」的某個值。當跳轉到保護模式時,它被分配了段選擇器的最低有效兩位的值。

我應該在執行遠端JMP之前確保CS的某些值符合此 條件嗎?

不,這是無關緊要的。從技術上講,CPU對分段寄存器的值不感興趣,但它們的影子寄存器"segment descriptor caches."這些影子寄存器包含RPL,DPL,CPL,基地址以及段描述符中的其他內容。實模式中不需要的值(如RPL)被設置爲適合實模式的值。從實模式切換到保護模式時,實模式中不需要的值變得必要,並且使用從GDT獲得的值進行初始化。當切換回實模式時,與保護模式相關的值再次變得無關緊要,從而得到指定的具體值。

畢竟,CPU直接從段描述符緩存中讀取,而不是從段寄存器中讀取。

有關該主題的更多信息,請閱讀this及其鏈接的論文。


其實,這是不完全正確。閱讀關於Unreal Mode