1. 程式人生 > >CPU的真實模式與保護模式(簡介)

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

16位微處理器

8086暫存器組成

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位實體地址。

32位微處理器

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

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

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

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

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


[說明]

由於在真實模式下,段的最大範圍是64KB,所以EIP的高16位必須全是0,仍相當於16位的IP作用

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

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

其中,增加了

IO特權級IOPL:當前執行程式或任務的CPL必須小於或等於這個IOPL才能訪問I/O地址空間。

巢狀任務標誌NT(Nest Task)

重啟動標誌RF(Reset Flag)

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

控制暫存器

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


CR0:含有控制CPU操作模式和狀態的標識

CR1:保留不用

CR2:儲存導致頁錯誤的線性地址

CR3:含有頁目錄表的實體記憶體基址

CR0中的保護控制位

PE:CR0的位0是啟用保護(Protection Enable)標誌。(CR0的最低位)

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

PG:CR0的位31是分頁(Paging)標誌。(CR0的最高位)

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

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

改變PG位的程式碼必須線上性地址空間和實體地址空間中具有相同地址,這部分具有相同地址的程式碼在分頁和未分頁世界之間起著橋樑的作用。

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


相關推薦

CPU真實模式保護模式簡介

16位微處理器 8086暫存器組成 8086/8088包括:4個16位的資料暫存器,2個16位的指標暫存器,2個16位變址暫存器,分成四組。 通用暫存器中,這些暫存器除完成規定的專門用途外,均可用於傳送和暫存資料,可以儲存算術邏輯運算的操作和運算結果。 段暫存器

真實模式保護模式的定址方式

文章目錄 一、真實模式定址 二、保護模式定址 三、參考資料 一、真實模式定址 CPU 在真實模式下,地址匯流排只有 20 位,定址空間為 1 M。 20 位的目標實體地址取決於兩個條件,一是 16 位的段基址,二是

x86 真實模式保護模式

0386開始,CPU有三種工作方式:真實模式,保護模式和虛擬8086模式。只有在剛剛啟動的時候是real-mode,等到作業系統執行起來以後就切換到protected-mode。真實模式只能訪問地址在1M以下的記憶體稱為常規記憶體,我們把地址在1M 以上的記憶體稱為擴充

保護模式及其程式設計——真實模式保護模式的切換

機器上電,CPU進入真實模式,從實體地址0xFFFFFFFF0處開始執行初始化程式碼,設定基本系統功能操作必要的資料結構資訊,例如處理中斷和異常的IDT表。接下來,如果繼續在保護模式工作,需要載入作業系統模組;如果要進入真實模式,那麼需要進行模式切換。 1.進入保護模式時的初始化操作 處理器能夠進入到保護模

模式保護模式

虛擬存儲器 有效 偏移 進程 代碼 訪問權限 描述符 兼容 ont 1. 實模式,又叫實地址模式,CPU完全按照8086的實際尋址方法訪問從00000h--FFFFFh(1MB大小)的地址範圍的內存,在這種模式下,CPU只能做單任務運行;尋址公式為:物理地址=左移4位的段

Activity四種啟動模式任務棧Task總結分析

最近在總結android基礎問題 比如Activity的四種啟動模式  其中有涉及到任務棧的問題   之前都是一知半解   現在想著用筆記錄下來  可供自己以後參考 android任務棧簡單瞭解 1. android任務棧又稱為Task,它是一個棧結構,具有後進先出的特性

真實模式保護模式

        今天我們來看看從真實模式是如何進入到保護模式的以及為何要進入保護模式。在這之前,我們先來看看什麼叫真實模式,什麼是保護模式。        

進入保護模式——《x86組合語言:從真實模式保護模式》讀書筆記14

首先來段題外話:之前我發現我貼出的程式碼都沒有行號,給講解帶來不便。所以從現在起,我要給程式碼加上行號。我寫部落格用的這個插入程式碼的外掛,確實不支援自動插入行號。我真的沒有找到什麼好方法,無奈之下,只能按照網友的說法,在VIM中給每行程式碼加上行號,然後再貼出來。 在VI

CPU真實模式保護模式(一)

真實模式和保護模式都是CPU的工作模式,而CPU的工作模式是指CPU的定址方式、暫存器大小等用來反應CPU在該環境下如何工作的概念。 1.真實模式工作原理 真實模式出現於早期8088CPU時期。當時由於CPU的效能有限,一共只有20位地址線(所以地址空間只有1MB),以及

任務和特權級保護——《x86組合語言:從真實模式保護模式》讀書筆記27

本文及後面的幾篇文章是原書第14章的讀書筆記。 1.LDT(區域性描述符表) 在之前的學習中,不管是核心程式還是使用者程式,我們都是把段描述符放在GDT中。但是,為了有效實施任務間的隔離,處理器建議每個任務都應該有自己的描述符表,稱為區域性描述符表LDT

儲存器的保護——《x86組合語言:從真實模式保護模式》讀書筆記20

儲存器的保護(三) 修改本章程式碼清單,使之可以檢測1MB以上的記憶體空間(從地址0x0010_0000開始,不考慮快取記憶體的影響)。要求:對記憶體的讀寫按雙字的長度進行,並在檢測的同時顯示已檢測的記憶體數量。建議對每個雙字單元用兩個花碼0x55AA5

程式的載入和執行——《x86組合語言:從真實模式保護模式》讀書筆記23

程式的載入和執行(三)——讀書筆記23 接著上次的內容說。 關於過程load_relocate_program的講解還沒有完,還差建立棧段描述符和重定位符號表。 1.分配棧空間與建立棧段描述符 462 ;建立程式堆疊段描述符 463

第12課 - 實模式保護模式

文本 選擇 字符串結束 使用 hello 移除 mode back fdt 不一般的jmp(s16->s32) 在16位代碼中,所有的立即數默認為16位 從16位代碼段跳轉到32位代碼段時,必須做強制轉換    深入保護模式:定義顯存段

06.真實模式進入保護模式

簡介 上一節我們實現了從核心載入器中載入其它扇區程式碼並執行,但始終工作在真實模式狀態下。記憶體定址方式和8086相同,由16位段暫存器的內容乘以16(10H)當做段基地址,加上16位偏移地址形成20位的實體地址,最大定址空間1MB,最大分段64KB。 保護模式與真

真實模式保護模式

       從80386開始,CPU有三種工作模式:真實模式、保護模式和虛擬8086模式。80286開始的CPU引入保護模式,實際上,真實模式概念是在保護模式推出之後為了區別保護模式之前的8086CPU工作模式才有的,在8086時代CPU工作模式只有一種,自然沒有真實模式之

關於虛擬機器VMware 中橋接模式nat模式的區別個人總結

一、橋接模式 1.本人通過網上的的查詢得到的答案是,橋接模式使用的是區域網模式,關聯的同時不會對主機網路產生很大的影響,但是我在配置的時候遇到的問題就是在不同的環境下,每次的ip地址都不一樣,導致每次都需要重新配置,橋接模式試用與在固定的網路下面使用,本人也通過配置靜態ip

4.由真實模式保護模式

學習於網易雲課堂:Linux作業系統, 構建自己的核心,講師:Coding迪斯尼 目標:實現32位定址 之前的暫存器直接存著要訪問的地址,一個暫存器16位,2^16*2^4=2^20=2M,加上偏移2^16=64kb,也就是說,真實模式的定址範圍是2M+(-)64kb

F#ASP.NET2:使用F#實現基於事件的非同步模式

在上一篇文章中,我們的簡單討論了.NET中兩種非同步模型以及它們在異常處理上的區別,並且簡單觀察了ASP.NET MVC 2中非同步Action的編寫方式。從中我們得知,ASP.NET MVC 2的非同步Action並非使用了傳統基於Begin/End的非同步程式設計模型,而是另一種基於事件的非同步模式。此外

F#ASP.NET1:基於事件的非同步模式非同步Action

提高ASP.NET應用程式伸縮性的有效手段之一便是使用非同步請求。而在ASP.NET MVC 1中是不能直接支援非同步Action的,因此我們需要使用一些簡單的Hack方式來實現這一點。不過簡單的Hack畢竟無法利用ASP.NET MVC的完整功能,幸好ASP.NET MVC 2已經正式支援ASP.NET中的

深入PHP面向物件、模式實踐——模式原則1

組合 模式的啟示 通過以靈活的方式來組合物件,元件能在執行時被定義。《設計模式》將此提煉出一個原則:組合優於繼承。 組合與繼承 繼承是應對變化的環境及上下文設計的有效方式,然而它會限制靈活性,尤其是當類承擔了過多的責任的時候。 問題 以下圖