1. 程式人生 > 實用技巧 >真實模式、保護模式和虛擬模式是X86中的概念。

真實模式、保護模式和虛擬模式是X86中的概念。

真實模式、保護模式和虛擬模式是X86中的概念。

從定址方式來說,CPU的IP(EIP)中存放的是虛地址,把一個虛地址轉換為實體地址,模式不同,轉換方式不同:

真實模式下--虛地址到實地址轉換,段暫存器左移四位與偏移相加,得到實體地址,定址空間1MB。

保護模式下--虛地址到實地址轉換經過MMU,也就是分段和分頁機制,定址空間4GB。另外,保護有兩層含義,一是保護作業系統不被隨意訪問和破壞,另外,保護應用程式在各自的地址空間不被隨意破壞。

在保護模式下CPU可以進入虛擬8086方式,這是在保護模式下的真實模式程式執行環境。

在微處理器的歷史上,第一款微處理器晶片4004是由Intel推出的,那是一個4位的微處理器。在4004之後,intel推出了一款8位處理器8080,它有1個主累加器(暫存器A)和6個次累加器(暫存器B、C、D、E、H和L),幾個次累加器可以配對(如組成BC、 DE或HL)用來訪問16位的記憶體地址,也就是說8080可訪問到64K內的地址空間。另外,那時還沒有段的概念,訪問記憶體都要通過絕對地址,因此程式中的地址必須進行硬編碼(給出具體地址),而且也難以重定位,這就不難理解為什麼當時的軟體大都是些可控性弱、結構簡陋,資料處理量小的工控程式了。

幾年後,intel開發出了16位的處理器8086,這個處理器標誌著Intel X86王朝的開始,這也是記憶體定址的第一次飛躍。之所以說這是一次飛躍,是因為8086處理器引入了一個重要概念--段。8086處理器引入了一個重要概念--段。8086處理器的定址目標是1M大的記憶體空間,於是它的地址匯流排擴充套件到了20位。但是,一個問題擺在了Intel設計人員面前,雖然地址匯流排寬度是20位的,但是CPU中“算術邏輯運算單元(ALU)”的寬度,即資料匯流排卻只有16位,也就是可直接加以運算的指標長度是16位的。如何填補這個空隙呢?可能的解決方案有多種,例如,可以像一些8位CPU中那樣,增設一些20位的指令專用於地址運算和操作,但是那樣又會造成CPU記憶體結構的不均勻。又例如,當時的PDP-11小型機也是16位的,但是其記憶體管理單元(MMU)可以將16位的地址對映到24位的地址空間。受此啟發,Intel設計了一種在當時看來不失為巧妙的方法,即分段的方法。

為了支援分段,Intel在8086 CPU中設定了四個段暫存器:CS、DS、SS和ES,分別用於可執行程式碼段、資料段、堆疊段及其他段。每個段暫存器都是16位的,對應於地址匯流排中的高16位。每條“訪內”指令中的內部地址也都是16位的,但是在送上地址匯流排之前,CPU內部自動地把它與某個段暫存器中的內容相加。因為段暫存器中的內容對應於20位地址匯流排中的高16位(就是把段暫存器左移4位),所以相加時實際上是記憶體匯流排中的高12位與段暫存器中的16位相加,而低4位保留不變,這樣就形成一個20位的實際地址,也就實現了從16位記憶體地址到20位實際地址的轉換,或者叫“對映”。段式記憶體管理帶來了顯而易見的優勢,程式的地址不再需要硬編碼了,除錯錯誤也更容易定位了,更可貴的是支援更大的記憶體地址。程式設計師開始獲得了自由。

技術的發展不會就此止步。intel的80286處理器於1982年問世了,它的地址匯流排位數增加到了24位,因此可以訪問到16M的記憶體空間。更重要的是從此開始引進了一個全新理念--保護模式。這種模式下記憶體段的訪問受到了限制。訪問記憶體時不能直接從段暫存器中獲得段的起始地址了,而需要經過額外轉換和檢查。為了和過去相容,80286記憶體定址可以有兩種方式,一種是先進的保護模式,另一種是老式的8086方式,被成為真實模式。系統啟動時處理器處於真實模式,只能訪問1M空間,經過處理可進入保護模式,訪問空間擴大到16M,但是要想從保護模式返回到真實模式,你只有重新啟動機器。還有一個致命的缺陷是80286雖然擴大了訪問空間,但是每個段的大小還是64k,程式規模仍受到限制。因此這個先天低能兒註定壽命不會很久。很快它就被天資卓越的兄弟--80386代替了。

80386是一個32位的CPU,也就是它的ALU資料匯流排是32位的,同時它的地址匯流排與資料匯流排寬度一致,也是32位,因此,其定址能力達到4GB。對於記憶體來說,似乎是足夠了。從理論上說,當資料匯流排與地址匯流排寬度一致時,其CPU結構應該簡潔明瞭。但是,80386無法做到這一點。作為X86產品系列的一員,80386必須維持那些段暫存器的存在,還必須支援真實模式,同時又要能支援保護模式,這給Intel的設計人員帶來很大的挑戰。Intel選擇了在段暫存器的基礎上構築保護模式,並且保留段暫存器16位。在保護模式下,它的段範圍不再受限於64K,可以達到4G。這一下真正解放了軟體工程師,他們不必再費盡心思去壓縮程式規模,軟體功能也因此迅速提升。

從8086的16位到80386的32位處理器,這看起來是處理器位數的變化,但實質上是處理器體系結構的變化,從定址方式上說,就是從“真實模式”到“保護模式”的變化。從80386以後,Intel的CPU經歷了80486、Pentium、PentiumII、PentiumIII等型號,雖然它們在速度上提高了好幾個數量級,功能上也有不少改進,但基本上屬於同一種系統結構的改進與加強,而無本質的變化,所以我們把80386以後的處理器統稱為IA32(32 Bit Intel Architecture)。