CPU三種工作方式:實模式,保護模式和虛擬8086模式

從80386開始,CPU有三種工作方式:實模式保護模式虛擬8086模式。只有在剛剛啓動的時候是real-mode,等到操作系統運行起來以後就切換到protected-mode。實模式只能訪問地址在1M以下的內存稱爲常規內存,我們把地址在1M 以上的內存稱爲擴展內存。在保護模式下,全部32條地址線有效,可尋址高達4G字節的物理地址空間; 擴充的存儲器分段管理機制和可選的存儲器分頁管理機制,不僅爲存儲器共享和保護提供了硬件支持,而且爲實現虛擬存儲器提供了硬件支持;支持多任務,能夠快速地進行任務切換(switch)保護任務環境(context); 4個特權級和完善的特權檢查機制,既能實現資源共享又能保證代碼和數據的安全和保密及任務的隔離; 支持虛擬8086方式,便於執行8086程序。


實模式(Real Mode)

它是 Intel公司80286及以後的x86(80386,8048680586)兼容處理器CPU)的一種操作模式。實模式被特殊定義爲20位地址內存可訪問空間上,這就意味着它的容量是220次冪(1M)的可訪問內存空間(物理內存和BIOS-ROM),軟件可通過這些地址直接訪問BIOS程序和外圍硬件。實模式下處理器沒有硬件級內存保護概念和多道任務的工作模式。但是爲了向下兼容,所以80286及以後的x86系列兼容處理器仍然是開機啓動時工作在實模式下80186和早期的處理器僅有一種操作模式,就是後來我們所定義的實模式。實模式雖然能訪問到1M的地址空間,但是由於BIOS的映射作用(即BIOS佔用了部分空間地址資源),所以真正能使用的物理內存空間(內存條),也就是在640k924k之間。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系列處理器操作系統(LinuxWindows95 and laterOS/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-16Bytes1M多餘出來的部分被稱做高端內存區HMA。但8086/8088只有20位地址線,只能夠訪問1M地址範圍的數據,所以如果訪問100000h~10FFEFh之間的內存(大於1M空間),則必須有第21根地址線來參與尋址(8086/8088沒有)。因此,當程序員給出超過1M100000H-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的功能。


保護模式(Protected Mode)

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

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

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

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

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

儘管 286386處理器能夠實現保護模式和兼容以前的版本,但是內存的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被禁止。則其第A20CPU做地址訪問的時候是無效的,永遠只能被作爲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 所示。當段寄存器被加載的時候,段基地址就會從相應的表入口獲得。描述符的內容會被存儲在一個程序員不可見的影像寄存器 (shadow register) 之中,以便下一次同一個段可以使用該信息而不用每次都到表中提取。物理地址由 16 位或者 32 位的偏移加上影像寄存器中的基址組成。實模式和保護模式的不同可以從下圖很清楚地看出來。


實模式地址



保護模式地址



總結

保護模式同實模式的根本區別是進程內存受保護與否。可尋址空間的區別只是這一原因的果。實模式將整個物理內存看成分段的區域,程序代碼和數據位於不同區域,系統程序和用戶程序沒有區別對待,而且每一個指針都是指向"實在"的物理地址。這樣一來,用戶程序的一個指針如果指向了系統程序區域或其他用戶程序 區域,並改變了值,那麼對於這個被修改的系統程序或用戶程序,其後果就很可能是災難性的。爲了克服這種低劣的內存管理方式,處理器廠商開發出保護模式。這 樣,物理內存地址不能直接被程序訪問,程序內部的地址(虛擬地址)要由操作系統轉化爲物理地址去訪問,程序對此一無所知。

至此,進程有了嚴格的邊界,任何其他進程根本沒有辦法訪問不屬於自己的物理內存區域,甚至在自己的虛擬地址範圍內也不是可以任意訪問的,因爲有一些虛擬區域已經被放進一些公共系統運行庫。這些區域也不能隨便修改,若修改就會有: SIGSEGV(linux 段錯誤);非法內存訪問對話框(windows 對話框)。

CPU啓動環境爲16位實模式,之後可以切換到保護模式。但從保護模式無法切換回實模式 。


對於80X86處理器來說,從80386處理器開始,除了以前的實模式外,還增添了
保護模式和V86模式。實模式和V86模式都是爲了和8086兼容而設置的。
 
實模式:
      內存尋址方式爲:段式尋址,即物理地址=段地址*16   +   段內偏移地址
      可尋址任意地址,所有指令都相當於工作在特權級。
      dos工作在實模式下
保護模式:
      內存尋址方式爲:支持內存分頁和虛擬內存
      支持多任務,可依靠硬件用一條指令即可實現任務切換,不同任務可工作在 不同的優先級下,操作系統工作在最高優先級0上,應用程序則運行       在較低優先級 上。從實模式到保護模式,需要建立GDT、IDT等數據表,然後通過修改控制寄存 器CR0的控制位(位0)來實現。
      Windows工作在保護模式下。
虛擬8086模式:
        內存尋址方式:段式尋址,與實模式一樣
        支持多任務和內存分頁
        v86模式主要是爲了在保護模式下兼容以前的實模式應用,即可支持多任務,
        但每個任務都是實模式的工作方式。

另外,中斷和異常等的處理對於不同的工作模式都是不同的,具體的可以去 參看一些相關書籍。



轉自鏈接:http://www.cppblog.com/mydriverc/articles/30719.html

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