真實模式,保護模式,虛擬8086模
下面按照這三種模式出現的先後時間順序來解釋
1. 真實模式
在早期的8086 CPU時,就是工作在這種模式。為了相容性,後來所有的CPU在開機時,最先都是執行在真實模式下。
1)在這種工作模式下,因為只有20根地址線,所以CPU的定址空間最大為1M
2)真實模式只支援單任務執行,不支援多工併發執行
3)真實模式不支援記憶體分頁管理機制,所以通過16位的段地址*16+偏移地址算出來的地址就是“實實在在”的實體地址。所以按這種方式,最大的缺陷就是,當段地址或偏移地址出錯時,就可能去修改了其他原不應該修改的記憶體,造成程式的crash或災難性的後果。
4)真實模式不支援優先順序保護機制。所有指令相當於都執行在特權級,所以它可以執行特權指令。如果去看核心的setup.s的程式碼可以發現,386就是在真實模式下先構建好GDT, LDT, IDT後,再初始化對應的GDTR, LDTR, IDTR等暫存器,最後全能TR0對應的位,進入保護模式。
2. 保護模式
1)從386後的CPU引入的保護模式新特性,此時地址匯流排擴充套件到了32位,所以CPU最大定址空間達到了4G
2)保護模式支援多工的併發執行,並且提供了硬體級別的任務切換功能
3)保護模式最重要的功能就是支援了記憶體分頁管理和記憶體保護機制,這時,段暫存器中的值不在是段基址,而是GDT/LDT/IDT的一個index,通過該index從對應的段描述符表中取出對應段的一些屬性,包括段基址、段限長等。然後由段基址和偏移地址組成線性地址。根據此線性地址和CR3(存的是頁目錄起始地址)做運算得出最終的實體地址。最大的好處就是,每個程序中使用的邏輯地址就是完全獨立的,最後要通過OS把其轉換成對應的實體地址,這樣,應用程式就不用關心是否會踩到其他程序的地址空間了。因為OS已經做了保證。同時正因為記憶體保護機制,可以利用虛擬記憶體來執行最大的軟體。
4)保護模式提供了優先順序保護機制。一共是0~3,4個優先順序,在linux中只用了0和3,分別對應最高特權級和最低特權級。核心程式碼執行在最高特權級,應用程式執行在最低特權級。這樣就可以保證使用者應用程式不會修改核心對應的資料。
3. 虛擬8086模式
其實是為了能夠在保護模式下執行真實模式程式而設定的。虛擬8086模式是以任務形式在保護模式下執行的,在386上可以同時支援由多個真正的386任務和虛擬8086模式構成的任務。在虛擬8086模式下支援多工和記憶體分頁。但對於記憶體的定址還是採用和8086一樣的定址方式。