實模式和保護模式(附i386/x86的由來)

實模式: (即實地址訪問模式)它是 Intel公司80286及以後的 x86(80386,80486和80586等 )兼容處理器( CPU)的一種操作模式。實模式被特殊定義爲 20位地址內存可訪問空間上,這就意味着它的容量是2的 20次冪( 1M)的可訪問內存空間(物理內存和BIOS-ROM),軟件可通過這些地址直接訪問 BIOS程序和外圍硬件。實模式下處理器沒有硬件級的內存保護概念和多道任務的工作模式。但是爲了向下兼容,所以80286及以後的 x86系列兼容處理器仍然是開機啓動時工作在實模式下。80186和早期的處理器僅有一種操作模式,就是後來我們所定義的實模式。實模式雖然能訪問到 1M的地址空間,但是由於 BIOS的映射作用(即 BIOS佔用了部分空間地址資源),所以真正能使用的物理內存空間(內存條),也就是在 640k到924k之間。 1M地址空間組成是由16位的段地址和 16位的段內偏移地址組成的。用公式表示爲:物理地址=左移 4位的段地址 +偏移地址。

286處理器體系結構引入了地址保護模式的概念,處理器能夠對內存及一些其他外圍設備做硬件級的保護設置(保護設置實質上就是屏蔽一些地址的訪問)。使用這些新的特性,然而必不可少一些額外的在80186及以前處理器沒有的操作規程。自從最初的 x86微處理器規格以後,它對程序開發完全向下兼容,80286芯片被製作成啓動時繼承了以前版本芯片的特性,工作在實模式下,在這種模式下實際上是關閉了新的保護功能特性,因此能使以往的軟件繼續工作在新的芯片下。直到今天,甚至最新的x86處理器都是在計算機加電啓動時都是工作在實模式下,它能運行爲以前處理器芯片寫的程序.

DOS操作系統(例如 MS-DOS,DR-DOS)工作在實模式下,微軟Windows早期的版本(它本質上是運行在 DOS上的圖形用戶界面應用程序,實際上本身並不是一個操作系統)也是運行在實模式下,直到Windows3.0,它運行期間既有實模式又有保護模式,所以說它是一種混合模式工作。它的保護模式運行有兩種不同意義(因爲 80286並沒有完全地實現 80386及以後的保護模式功能 ):

1〉“標准保護模式”:這就是程序運行在保護模式下;

2〉“虛擬保護模式(實質上還是實模式,是實模式上模擬的保護模式)”:它也使用 32位地址尋址方式。Windows3.1徹底刪除了對實模式的支持。在 80286處理器芯片以後,Windows3.1成爲主流操作系統( Windows/80286不是主流產品)。目前差不多所有的X86系列處理器操作系統( Linux, Windows95and later, OS/2等)都是在啓動時進行處理器設置而進入保護模式的。

實模式工作機理:

1> 對於 8086/8088來說計算實際地址是用絕對地址對 1M求模。 8086的地址線的物理結構: 20根,也就是它可以物理尋址的內存範圍爲 2^20個字節,即 1 M空間,但由於 8086/8088所使用的寄存器都是 16位,能夠表示的地址範圍只有 0-64K,這和 1M地址空間來比較也太小了,所以爲了在 8086/8088下能夠訪問 1M內存, Intel採取了分段尋址的模式: 16位段基地址 :16位偏移 EA。其絕對地址計算方法爲:16位基地址左移 4位 +16位偏移 =20位地址。  比如: DS=1000H EA=FFFFH 那麼絕對地址就爲:10000H + 0FFFFH = 1FFFFH 地址單元 。通過這種方法來實現使用16位寄存器訪問 1M的地址空間,這種技術是處理器內部實現的,通過上述分段技術模式,能夠表示的最大內存爲:FFFFh:FFFFh=FFFF0h+FFFFh=10FFEFh=1M+64K-16Bytes( 1M多餘出來的部分被稱做高端內存區 HMA)。但8086/8088只有 20位地址線,只能夠訪問 1M地址範圍的數據,所以如果訪問100000h~10FFEFh之間的內存(大於 1M空間),則必須有第21根地址線來參與尋址( 8086/8088沒有)。因此,當程序員給出超過1M( 100000H-10FFEFH)的地址時,因爲邏輯上正常,系統並不認爲其訪問越界而產生異常,而是自動從0開始計算,也就是說系統計算實際地址的時候是按照對 1M求模的方式進行的,這種技術被稱爲wrap-around。

2> 對於 80286或以上的 CPU通過A20 GATE來控制 A20地址線 。 技術發展到了 80286,雖然系統的地址總線由原來的20根發展爲 24根,這樣能夠訪問的內存可以達到2^24=16M,但是 Intel在設計 80286時提出的目標是向下兼容 ,所以在實模式下,系統所表現的行爲應該和8086/8088所表現的完全一樣,也就是說,在實模式下, 80386以及後續系列應該和8086/8088完全兼容仍然使用 A20地址線。所以說80286芯片存在一個 BUG:它開設 A20地址線。如果程序員訪問 100000H-10FFEFH之間的內存,系統將實際訪問這塊內存(沒有wrap-around技術),而不是象 8086/8088一樣從0開始。我們來看一副圖:

      

      爲了解決上述兼容性問題, IBM使用鍵盤控制器上剩餘的一些輸出線來管理第21根地址線(從 0開始數是第 20根)  的有效性,被稱爲 A20 Gate:

     1> 如果 A20 Gate被打開,則當程序員給出 100000H-10FFEFH之間的地址的時候,系統將真正訪問這塊內存區域;

     2 如果 A20 Gate被禁止,則當程序員給出100000H-10FFEFH之間的地址的時候,系統仍然使用 8086/8088的方式即取模方式( 8086仿真)。絕大多數 IBM PC兼容機默認的 A20 Gate是被禁止的。現在許多新型 PC上存在直接通過 BIOS功能調用來控制 A20 Gate的功能。

      上面所述的內存訪問模式都是實模式,在 80286以及更高系列的 PC中,即使 A20 Gate被打開,在實模式下所能夠訪問的內存最大也只能爲10FFEFH,儘管它們的地址總線所能夠訪問的能力都大大超過這個限制。爲了能夠訪問 10FFEFH以上的內存,則必須進入保護模式。

保護模式: 經常縮寫爲 p-mode,在 InteliAPX 286程序員參考手冊中( iAPX 286是Intel 80286的另一種叫法) 它又被稱作爲虛擬地址保護模式。經管在 Intel 80286手冊中已經提出了虛地址保護模式,但實際上它只是一個指引,真正的 32位地址出現在Intel 80386上。保護模式本身是 80286及以後兼容處理器序列之後產成的一種操作模式,它具有許多特性設計爲提高系統的多道任務和系統的穩定性。例如內存的保護,分頁機制和硬件虛擬存儲的支持。現代多數的x86處理器操作系統都運行在保護模式下,包括 Linux, Free BSD, 和 Windows 3.0(它也運行在實模式下,爲了和 Windows2.x應用程序兼容)及以後的版本。

80286及以後的處理器另一種工作模式是實模式(僅當系統啓動的一瞬間),本着向下兼容的原則屏蔽保護模式特性,從而容許老的軟件能夠運行在新的芯片上。作爲一個設計規範,所有的x86系列處理器,除嵌入式 Intel80387之外,都是系統啓動工作在實模式下,確保遺留下的操作系統向下兼容。它們都必須被啓動程序(操作系統程序最初運行代碼)重新設置而相應進入保護模式的,在這之前任何的保護模式特性都是無效的。在現代計算機中,這種匹配進入保護模式是操作系統啓動時最前沿的動作之一。

在被調停的多道任務程序中,它可以從新工作在實模式下是相當可能的。保護模式的特性是阻止被其他任務或系統內核破壞已經不健全的程序的運行,保護模式也有對硬件的支持,例如中斷運行程序,移動運行進程文檔到另一個進程和置空多任務的保護功能。

386及以後系列處理器不僅具有保護模式又具有 32位寄存器,結果導致了處理功能的混亂,因爲80286雖然支持保護模式,但是它的寄存器都是 16位的,它是通過自身程序設定而模擬出的32位,並非 32位寄存器處理。歸咎於這種混亂現象,它促使Windows/386及以後的版本徹底拋棄 80286的虛擬保護模式,以後保護模式的操作系統都是運行在80386以上,不再運行在 80286(儘管 80286模式支持保護模式),所以說 80286是一個過渡芯片,它是一個過渡產品。

儘管 286和386處理器能夠實現保護模式和兼容以前的版本,但是內存的 1M以上空間還是不易存取,由於內存地址的迴繞,IBM PC XT (現以廢棄)設計一種模擬系統,它能過欺騙手段訪問到 1M以上的地址空間,就是開通了A20地址線。在保護模式裏,前 32箇中斷爲處理器異常預留,例如,中斷0D(十進制 13)常規保護故障和中斷 00是除數爲零異常。

如果要訪問更多的內存,則必須進入保護模式,那麼,在保護模式下,A20 Gate對於內存訪問有什麼影響呢?

      爲了搞清楚這一點,我們先來看一看 A20的工作原理。 A20,從它的名字就可以看出來,其實它就是對於 A20(從 0開始數)的特殊處理 (也就是對第 21根地址線的處理)。如果 A20 Gate被禁止,對於 80286來說,其地址爲 24根地址線,其地址表示爲 EFFFFF;對於 80386極其隨後的 32根地址線芯片來說,其地址表示爲FFEFFFFF。這種表示的意思是:


    1>如果 A20 Gate被禁止。則其第 A20在 CPU做地址訪問的時候是無效的,永遠只能被作爲 0。所以,在保護模式下,如果 A20 Gate被禁止,則可以訪問的內存只能是奇數1M段,即 1M,3M,5M…,也就是00000-FFFFF, 200000-2FFFFF,300000-3FFFFF…

     2如果 A20 Gate被打開。則其第 20-bit是有效的,其值既可以是 0,又可以是 1。那麼就可以使A20線傳遞實際的地址信號。如果 A20 Gate被打開,則可以訪問的內存則是連續的。

實模式和保護模式的區別: 從表面上看,保護模式和實模式並沒有太大的區別,二者都使用了內存段、中斷和設備驅動來處理硬件,但二者有很多不同之處。我們知道,在實模式中內存被劃分成段,每個段的大小爲 64KB ,而這樣的段地址可以用 16 位來表示。內存段的處理是通過和段寄存器相關聯的內部機制來處理的,這些段寄存器( CS 、 DS 、 SS 和 ES )的內容形成了物理地址的一部分。具體來說,最終的物理地址是由16位的段地址和 16 位的段內偏移地址組成的。用公式表示爲:物理地址=左移 4 位的段地址 + 偏移地址。

在保護模式下,段是通過一系列被稱之爲 “ 描述符表 ” 的表所定義的。段寄存器存儲的是指向這些表的指針。用於定義內存段的表有兩種:全局描述符表 (GDT) 和局部描述符表 (LDT)。 GDT 是一個段描述符數組,其中包含所有應用程序都可以使用的基本描述符。在實模式中,段長是固定的 (爲 64KB) ,而在保護模式中,段長是可變的,其最大可達4GB。 LDT 也是段描述符的一個數組。與 GDT 不同, LDT是一個段,其中存放的是局部的、不需要全局共享的段描述符。每一個操作系統都必須定義一個 GDT ,而每一個正在運行的任務都會有一個相應的LDT。每一個描述符的長度是 8 個字節,格式如圖 3 所示。當段寄存器被加載的時候,段基地址就會從相應的表入口獲得。描述符的內容會被存儲在一個程序員不可見的影像寄存器 (shadowregister) 之中,以便下一次同一個段可以使用該信息而不用每次都到表中提取。物理地址由 16 位或者 32 位的偏移加上影像寄存器中的基址組成。實模式和保護模式的不同可以從下圖很清楚地看出來。

                

                                       實模式下尋址方式

   

                    保護模式下尋址方式

PS:
      計算機剛啓動的時候,CPU首先以實模式的方式工作,直到啓動操作系統後纔會切換到保護模式下工作;
      從8086到80386,雖然位數從16位擴展成了32位,但CPU的體系結構卻發生了質的改變。其中,尋址方式從實模式到保護模式的轉變對CPU的計算 能力起到了至關重要的作用。80386的後續型號(如80486,奔騰,奔騰4等)雖然計算速度在飛速提高,但最核心的體系結構基本上沒有多大變化。所以 人們把80386及其後續型號統稱爲“x86”或“i386”。

 

From: http://www.cnblogs.com/dartagnan/archive/2010/11/16/2003554.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章