IA-32架構支持三種基本的運行模式,每種模式下可執行的指令和可用的功能可能不一樣:

  1. 保護模式(Protected Mode)。這是最常見的模式,這是一個受保護的並且支持多任務的環境。之所以受保護是因為在這個模式下,能夠對內存及一些外圍設備提供硬體級別的保護設置,如分段機制,分頁機制。大部分OS都運行在這個模式下。
  2. 實地址模式(Read-address mode)。這個運行模式是為了兼容8086處理器,通常處理器上電後會處於這個模式,在實地址模式中,定址空間只有1MB,CS、DS等稱作Segment register,即段的基地址直接是Segment register的值向左移4位。在保護模式下,CS、DS等稱作Segment selector,用於從GDT或LDT表中選擇一個段描述符,基地址在段描述符內,兩種情況下用法不一樣,所以兩者的定址空間也差別很大。
  3. 系統管理模式(System management mode ,SMM)。這個模式提供一個跟平臺相關的管理環境,比如電源管理,RAS功能配置或者系統安全等相關問題。這個模式下的code通常是由UEFI/BIOS提供的,對OS來說是透明的。SMM有自己獨立的地址空間,OS是看不到的。處理器接收到SMI pin上的中斷或者APIC接收到SMI中斷的時候才會進入到SMM模式。

Intel 64結構添加了IA-32e模式,並且IA-32e模式中又有兩種子模式:

  1. 兼容模式(Compatibility mode)。兼容模式顧名思義,就是向前兼容IA-32的模式,該模式允許傳統的16-bit和32-bit的程序不需要重新編譯就可以跑在64-bit的 OS下。
  2. 64位模式(64-bit mode)。這個模式讓應用程序能夠訪問64位的地址,並且該模式擴展了通用寄存器的寬度和數量。

為了簡單起見,Intel 64的兼容模式和64位模式也可以叫做IA-32的兼容模式和64位模式。

IA-32架構的內存模型主要包括以下三種:

  1. 平坦內存模型(Flat memory model)。該模型下所有的段基址都是0,相當於沒有使用到分段機制。
  2. 分段內存模型(Segmented memory mode)。內存的線性地址由段選擇寄存器(CS、DS、ES或SS等所包含的內容是Segment Selector而不是Segment register)所指向的段描述符提供的段基地址加上偏移量計算得出。這個過程就是logic address到linear address的轉換。採用分段機制的目的就是為了將不同的數據隔離開來,防止數據混到一起從而提高系統的可靠性。
  3. 實地址模式內存模型(Read-address mode memory model)。這個模式是為了兼容8086處理器,從而能否跑那些為8086處理器寫的程序。CS,DS等寄存器稱作Segment register,而不是Segment Selector,該寄存器的值本身就包含段的基地址。在這個模式下,每個段的大小隻有64KB,並且地址空間只有1MB。

不同的運行模式和內存模式的關係如下:

  1. 保護模式。以上三種內存模型都可以使用,實模式內存模型通常是用在virtual-8086模式。當運行多任務的時候,每種任務可以採用不同的內存模型。
  2. 實地址模式。該模式下只能採用實地址模式內存模型。
  3. 系統管理模式。該模式會切換到SMRAM中,所採用的內存模型類似於實地址模式內存模型。
  4. 兼容模式。該模式採用的內存模型應該跟32-bit的保護模式一樣。
  5. 64-bit模式。該模式下分段機制通常不使用,通常採用平坦內存模型,即所有的段基地址都為0,並且段的上限都為最大值。

沒想到Intel 64架構竟然還兼容8086處理器,可見Intel x86 CPU為了兼容性背負了多大的歷史包袱,這也導致Intel x86 CPU的複雜度大大提升。


推薦閱讀:
相關文章