CPU的實模式與保護模式(簡介)

2021-06-21 07:14:11 字數 3595 閱讀 4528

8086/8088包括:4個16位的資料暫存器,2個16位的指標暫存器,2個16位變址暫存器,分成四組。

通用暫存器中,這些暫存器除完成規定的專門用途外,均可用於傳送和暫存資料,可以儲存算術邏輯運算的操作和運算結果。

段暫存器能在8086 中實現1m物理空間定址,並可與8080 cpu進行相容。段暫存器都是16位的,分別稱為**段(code segment)暫存器cs、資料段(data segment)暫存器ds、堆疊段(stack segment)暫存器ss,附加段暫存器。

標誌暫存器在8086中有乙個16位用於反映處理器的狀態和運算結果的某些特徵。(其中只有9位有定義)

這些標誌位分為兩類:

其一是運算結果標誌,主要用於反映處理器的狀態和運算結果特徵。(例如:進製標誌、零標誌、符號標誌、溢位標誌等)

其二是狀態控制標誌,它控制著處理器的操作。要通過專門的指令才能使狀態控制標誌發生變化。(例如:方向標誌、中斷允許標誌、追蹤標誌)

8086 cpu有20根位址線,可直接定址的實體地址空間為1m。儘管8086/8088內部的alu每次最多進行16位運算,但存放儲存單元位址偏移的指標暫存器都是16位的,所以8080/8086通過記憶體分段和使用段暫存器的方法來有效地實現定址1m的空間。

段值:偏移

實體地址(20位) = 段值*16+偏移

段值通過段暫存器的值來取得,偏移可由指令指標的ip或其他可作為記憶體指標使用的暫存器給出。偏移還可以直接用16位數給出。

指令中不使用實體地址,而使用邏輯位址,由匯流排介面單元biu按需要根據段值和偏移自動形成20位實體地址。

2023年,真正的32位微處理器80386dx誕生,為32位軟體的開發提供了廣闊的舞台。

80386暫存器的寬度大多是32位,可分為如下幾組:

通用暫存器、段暫存器、指令指標

及標誌暫存器、系統位址暫存器、除錯暫存器、控制暫存器和測試暫存器。

應用程式主要使用前面三組暫存器,只有系統才會使用其他暫存器。

[說明]

由於在實模式下,段的最大範圍是64kb,所以eip的高16位必須全是0,仍相當於16位的ip作用。

注意,在32位模式下,段暫存器仍然是16位。

80836中,標誌暫存器也擴充套件到了32位,記為eflag

其中,增加了

io特權級iopl

巢狀任務標誌nt(nest task)

重啟動標誌rf(reset flag)

虛擬8086標誌vm

:當設定該標誌時,就開啟虛擬8086方式,當復位該標誌時,則回到保護模式。

控制暫存器(cr0~cr3)用於控制和確定處理器的操作模式以及當前執行任務的特性。4個控制暫存器都是32位的。

cr0:含有控制cpu操作模式和狀態的標識

cr1:保留不用

cr3:含有頁目錄表的物理記憶體基址

cr0中的保護控制位:

pe:cr0的位0是啟用保護(protection enable)標誌。(cr0的最低位)

當設定該位時即開啟了保護模式,當復位時即進入實位址模式。這個標誌僅開啟段級保護,而沒有啟用分頁機制。若要啟用分頁機制,那麼pe和pg都要置位。

pg:cr0的位31是分頁(paging)標誌。(cr0的最高位)

當設定該位時即開啟了分頁機制,當復位時則禁止分頁機制,此時所有線性位址等同於實體地址。

注意,在開啟這個標誌之前必須已經開啟pe標誌,否則cpu會產生乙個一般保護性異常。

如果pe=0、pg=0,處理器工作在實位址模式下。(相容早期的實模式作業系統)

如果pe=1、pg=0,處理器工作在無分頁機制的段保護模式下(相容段式管理的作業系統)

如果pe=1、pg=1,處理器工作在段頁式保護模式下

在系統剛上電時,處理器被復位成pe=0和pg=0(即實模式狀態),以允許引導**在啟用分段和分頁機制之前能夠初始化這些暫存器和資料結構。

程式原理

cpu是如何處理實體地址的?

在實模式下用段暫存器左移4位與偏移量相加。在保護模式下用段描述符中的基址加偏移量。這兩者其實是一樣的

。當intel把80286推出時,其位址空間變成了24位,則從8086的20位到24位,十分自然地要加大段暫存器才行。實際上,段暫存器和指標都被加大了,只是由於保護的原因,加大的部分沒有被程式看見,到了80386之後,位址又從24位加大到32位。

在8086中,cpu只有「看得見部分」,但在80286之後,在「看不見部分」中已經包含了位址值。「看得見部分」就退化為只是乙個標號,再也不用參與位址形成運算了。位址的形成總是從「不可看見部分」取出基址值與偏移相加形成位址

。也就是說,在實模式下,當乙個段暫存器被裝入乙個值時,「看不見部分」的段限界被設成ffffh,基址部分將裝入值左移4位,段屬性部分設成16位0特權級。這個過程與保護模式時裝入乙個段暫存器是同理的,只是保護模式的「不可見部分」是從描述表中取值,而實模式是一套固定的過程。

對於cpu在翻譯位址時,是沒有實模式與保護模式之分的,它只管用基址(「不可見部分」)去加上偏移量

。實模式下的段暫存器裝入有固定的形成辦法,從而也就不需要保護模式的「描述符」了,因此,保持了與8086/8088的相容性。而「描述符」也只是為了裝入段暫存器的「不可見部分」而設的。(保護模式。還為了儲存段屬性等實現保護機制的資料結構)

cpu的位址形成與「看得見部分」的當前值毫無關係。這也就解釋了為什麼剛進入保護模式時,後面的**依然被正確地執行,而這時**段暫存器cs的值還是進入保護模式前的實模式值,或者從保護模式回到實模式時,**段cs被改變之前程式是正常地工作,而不會「突變」到cs左移4位的位址上去。

比如:在保護模式時,cs是08h的選擇子,到了實模式時,cs還是08h,但位址不會突然變成80h加上偏移量。因為位址的形成不理會段暫存器「看得見部分」的當前值,這一值只是在被裝入時對cpu有用。(實模式與保護模式只是在向段暫存器載入值時處理不同,之後的處理是相同的)

位址的形成與cpu的工作模式無關,也就是說,實模式與0特權級保護模式不分頁時是一模一樣的。明白了這一機理後,在實模式下一樣可以處理通常被認為只有在保護模式才能做的事,比如訪問整個機器的記憶體。不必理會保護模式下的眾多術語或許會更易於理解,如選擇子就是「看得見部分」,描述符是為了裝入「不可見部分」而設的。

【後記】

記憶體管理,實際上是cpu製造廠家提出的記憶體管理方案,並提供了硬體機制來幫助作業系統來實現。作業系統做的工作就是維護相關的資料結構,並做具體的操作。

cpu提供了各種段暫存器用於查詢段表中的段,還提供了控制暫存器用於實現段頁式記憶體管理,而段表和頁表等資料結構是要由作業系統來實現並維護的。

實模式與保護模式

實模式與保護模式 1.實模式,又叫實位址模式,cpu完全按照8086的實際定址方法訪問從00000h fffffh 1mb大小 的位址範圍的記憶體,在這種模式下,cpu只能做單任務執行 定址公式為 實體地址 左移4位的段位址 偏移位址,即 實體地址是由16位的段位址和16位的段內偏移位址組成的。2....

實模式與保護模式

實模式 即實位址訪問模式 它是intel公司80286及以後的x86 80386,80486和80586等 相容處理器 cpu 的一種操作模式。實模式被特殊定義為20位位址記憶體可訪問空間上,這就意味著它的容量是2的20次冪 1m 的可訪問記憶體空間 物理記憶體和bios rom 軟體可通過這些位址...

實模式與保護模式

1.x86實模式介紹 x86體系的處理器剛開始時只有20根位址線,定址暫存器是16位。我們知道16位的暫存器可以訪問64k的位址空間,如果程式要想訪問大於64k的記憶體,就需要把記憶體分段,每段64k,用段位址 偏移量的方式來訪問,這樣使20根位址線全用上,最大的定址空間就可以到1m位元組,這在當時...