IA 32體系結構CPU保護模式常見誤區

2021-06-16 08:22:57 字數 2396 閱讀 1197

系統軟體開發系列文章之一:ia-32體系結構cpu保護模式常見誤區

(20100603隨筆版,不保證完全的學術嚴謹)

立志於成為系統程式設計師的同學們,或者嘗試作業系統開發的程式設計師們,在閱讀ia-32體系結構(以下簡稱80386)保護模式相關資料時,常常被一些表述不清晰,甚至可能存在理解錯誤的資料所誤導。筆者簡單總結了80386保護模式中的一些常見誤區,這些誤區曾經被國內的一些教材反覆引用,在此列出,以供學習者參考。

1、80386保護模式下的段暫存器是16位的

錯誤!實際上無論實模式還是保護模式,80386的段暫存器都是80位,但只有16位是可見的,也就是說,程式設計師只能訪問80位段暫存器中的16位。

段暫存器中64位的不可見部分,一般資料稱之為「描述符快取記憶體暫存器」或者「影子暫存器」,這一部分是真正控制80386 cpu內部硬體電路定址的暫存器,其內容就是乙個描述符。

保護模式下,當修改段暫存器中16位的可見部分(也就是程式設計師訪問的cs、ds、ss、es、fs和gs)時,80386認為這16位可見部分是乙個段選擇子(selector),於是根據選擇子中的索引,在gdt或者ldt中定位對應的描述符,檢查保護模式段保護規則(特權級)沒有被違反後,將對應的描述符裝載到段暫存器不可見部分中,80386 cpu內部硬體電路即根據段暫存器不可見部分中的描述符對應的基址和限長進行線性位址定址。

實模式下,段暫存器64位不可見部分的內容仍然是乙個描述符(自動生成的16位段描述符),對應的限長是64kb,基址是段暫存器16位可見部分左移4位,當16位可見部分發生改變時,自動生成新的基址,並自動更新64位不可見部分中的描述符。80386 cpu內部硬體電路還是根據段暫存器不可見部分中的描述符對應的基址和限長進行定址。

可以看出,無論是實模式還是保護模式,實際定址都是由段暫存器64位不可見部分決定的,實模式和保護模式的區別只在於生成段暫存器64位不可見部分中的描述符的方式不同。

需要特別注意的一點是:如果不改變段暫存器16位可見部分,也就是程式設計師不修改cs、ds、ss、es、fs或者gs,那麼64位不可見部分的內容就不會被重新裝載或者更新,即使發生了實模式和保護模式之間的切換也是一樣。

2、修改cr0暫存器中的pe位之後需要執行一條遠跳轉指令才能進入保護模式

錯誤!只要將cr0暫存器中的pe位設定為1,80386就已經進入了保護模式,但是如果沒有修改cs的內容,則對應的64位不可見部分中的內容還是實模式下自動生成的描述符,並沒有自動從gdt或者ldt中裝載新的描述符,記憶體指令定址方式並沒有發生變化。這一點是必需的,否則如果80386一旦進入保護模式就自動裝載新的描述符,則記憶體指令定址方式立即發生變化,對緊隨進入保護模式指令之後的後續指令,就無法正確從記憶體中取指令並執行。

進入保護模式之後的遠跳轉指令的作用,實際上就是更新cs的內容,由於此時已經進入保護模式,才會自動從gdt或者ldt中裝載新的描述符到cs對應的64位不可見部分中,這樣描述符指定的保護模式分段定址方式才被真正啟用。

換句話說,將cr0暫存器中的pe位設定為1可以讓80386進入保護模式,但只有通過遠跳轉指令等方法修改了cs的內容,才能啟用gdt或者ldt中描述符指定的保護模式分段定址方式。

3、實模式下一定不能訪問4gb記憶體

錯誤!先進入保護模式,在保護模式下,選擇乙個實模式作業系統(例如dos)下通常不被使用的附加資料段暫存器(例如fs),修改其內容(16位可見部分內容),使其定位到gdt或者ldt中乙個基址為0,限長為4gb的資料段描述符,這樣描述符被自動裝載到fs對應的64位不可見部分中,隨後退回到實模式,只要不更新fs的內容,64位不可見部分中的內容仍然是基址為0,限長為4gb的資料段描述符,這樣通過fs和對應32位偏移量就能訪問到4gb記憶體。

早年講述dos高階程式設計的一些書籍上都介紹過「實模式下訪問4gb記憶體」的方法,其方法原理正是如此。

4、段保護的實質是什麼?

在保護模式分段定址方式下,真正控制80386 cpu硬體電路定址的是段暫存器64位不可見部分中的描述符,因此只要阻止違反段保護規則的描述符被裝載到段暫存器64位不可見部分中,即可實現段保護。80386 cpu是不可能在從記憶體中取每一條指令,或者讀寫每乙個位元組資料時都進行特權級檢查的,這樣會嚴重降低cpu的效率。

這也是為什麼段暫存器有64位不可見部分的原因,因為這一部分只能在不違反段保護規則的情況下更新,不能由程式設計師自由修改,因此對程式設計師不可見。

除某些特殊情況(例如通過呼叫門進行的呼叫)之外,段保護的一般規則是:

cpl:當前特權級

rpl:請求特權級(準備更新段暫存器16位可見部分的選擇子確定的特權級)

dpl:描述符特權級(準備裝載到段暫存器64位不可見部分中的描述符確定的特權級)

則要求cpl和rpl都不低於dpl(如果進行特權級數字的比較,應該是不大於),即(cpl<=dpl)&&(rpl<=dpl)。

IA32體系結構1(x86暫存器)

intel architecture 32位處理器,主要以80386為參考。包括以下幾類暫存器 1.通用暫存器 2.段暫存器 3.狀態和控制暫存器 4.指令指標暫存器eip 5.記憶體管理暫存器 6.控制暫存器 通用暫存器有8個,分別是eax ebx ecx edx esi edi ebp esp。...

IA32體系結構3(x86機器碼概述)

歸根結底,處理器只認識機器語言,處理器會按照機器碼的指示進行動作。x86體系結構使用指令長度可變的機器語言,一條機器碼指令可以從1位元組到13位元組不等。這個跟arm還是有很大區別,arm32位處理器的話,是定長指令,是32位長度。8086 80286使用16位指令模式,80386以上處理器也可以工...

CPU各種體系結構

本貼 http hi.baidu.com shentuhongfeng blog item 2d9bb01fdd4fedf9e0fe0b8d.html cpu體系結構的選定也決定了其他硬體的選擇。不同的cpu需要不同的主機板,主機板決定了所能選擇的儲存器和您要使用的插卡 plug in card 1...