转载:保护模式1
實模式與保護模式
摘自ITWIKI,為我和還沒搞明白真實模式保護模式的XDJM們
真實模式
Intel 8086和8088有14個16位緩存器。其中四個(AX, BX, CX, DX)是通用目的(盡管每個緩存器有額外的目的;舉個例子:CX可以被用來當作loop(循環)指令的計數器。每個緩存器可以被當成兩個分開的字節存取(因此BX的高位可以被當成BH以及低位BL)。除了這些緩存器, 還有四個區段緩存器(CS、DS、SS、ES)。他們用來產生內存的尋址。還有兩個指針緩存器(SP是指向堆棧的底部, BP可以用來指向堆棧或內存的其它地方)。兩個指針緩存器(SI和DI)可以用來指向數組的內部。最后,有旗標緩存器(包含狀態旗標比如進位、溢位、結果為零,等等)。以及IP是用來指向目前執行指令個地址。
在真實模式下,內存的存取是被區段開來。為了得到最后20位的內存地址,要將區段的地址往左移動4位,并且加上偏移的地址。因此,真實模式下總共可以尋址的空間是220字節, 或者是1MB,于1979年是相當讓人印象深刻的象征。在真實模式下有兩種尋址模式:near和far。在 far模式,區段跟偏移都需要被指定;在near模式,只需要偏移模式被指定,而內存區段是由適當的區段緩存器獲得。以數據而言是使用DS緩存器,程序代碼是CS緩存器,堆棧是SS緩存器。舉個例子,如果DS是A000h且SI是5677h,DS:SI會指向計憶體的絕對地址DS × 16 + SI = A5677h
在這種架構下,兩對不同的區段/篇移可以指向一個相同的絕對地址。因此如果DS是A111h且SI是4567h,DS:SI會指向跟上一段相同的A5677h。除了duplicity之外,這種架構無法同時一次擁有4個以上的區段。此外,CS、DS和SS是為了程序正確功能而必須的,因此僅僅只有ES可以被用來指向其它的地方。這種模式原本是為了與Intel 8085兼容,導致程序設計師永無止盡的痛苦。
除了以上所說的,8086也擁有8-bit的64K(另一種說法是16-bit的32K)輸出輸入(en:I/O)空間,以及一個由硬件支持的64K(一個區段)內存堆棧。只有words(2字節)可以被推入到堆棧中。堆棧是由內存的上端往下成長,他的底端是由SS:SP指向。有256個中斷(interrupts),可以由硬件或是軟件同時組成。中斷是可以串連在一起,使用堆棧來儲存返回被中斷的程序地址。
?
16位保護模式
Intel 80286可以在不改變任何東西下支持8086的真實模式16位軟件,然而它也支持額外的工作模式稱為保護模式,可以將可尋址的物理內存擴充到16MB,可尋址的虛擬內存最大到 1GB。這是使用節區緩存器來儲存在節區表格中的索引值。處理器中有兩個這樣的表格,分別為GDT和LDT,每一個可以儲存最多8192個節區的描述子,每一個節區可以給予最大到64KB的內存存取。節區表格提供一個24位的基地址(base address),可以用此基地址增加想要的偏移量來創造出一個絕對地址。此外,每一個節區可以被賦予四種權限等級中的一種(稱為 "rings")。
盡管這個推出的功能是一項進步,但是他們并沒有被廣泛地使用,因為保護模式的操作系統無法執行現有的真實模式軟件。這樣的能力只有在隨后80386處理器的虛擬86模式中出現。
在同時,操作系統比如OS/2嘗試使用類似乒乓的方法,讓處理器在保護和真實模式間切換。這樣都會讓計算機變慢且不安全,像是在真實模式下的程序可以輕易地使計算機當機。OS/2也定義了限制性的程序設計規則允許"Family API"或"bound"程序可以在真實模式或保護模式下執行。然而這是給原本為保護模式下設計的程序有關,反之則不然。保護模式程序并不支持節區選擇子和物理內存之間的關系。有時候會錯誤地相信在16位保護模式下執行真實模式的程序,導致IBM必須選擇使用Intel保留給BIOS的中斷呼叫。事實上這類的程序使用任意的選擇子數值和使用在上面提到的“節區運算”的方式有關。
這個問題也在Windows 3.x上出現。這個推出版本想要在16位保護模式下執行程序,而先前的版本只能在真實模式下執行。理論上,如果Windows 1.x或2.x程序是寫得“適當”且避免使用節區運算的方式,它就有可能在真實和保護模式兩者下執行。Windows程序一般來說都會避免節區運算,這是因為Windows實作出軟件的虛擬內存方式,及當程序不執行時候,搬移內存中的程序代碼和數據,所以操作絕對地址的方式是很危險的;當程序不執行時,被認為要保持內存區塊的“handles”,這樣的handles已經非常相當于保護模式的選擇子。在保護模式下的Windows 3.0執行一個舊的程序,會觸發一個警告對話盒,建議在真實模式下執行Windows(推測還是仍然可以使用擴充內存,可能是在80386機器用EMM386模擬,因此它并不被局限于640KB)或是從廠商那更新到新的版本。好的行為之程序可能可以使用特別的工具來避免這樣的對話盒。不可能有些GUI程序在16位保護模式下執行,且其它GUI程序在真實模式執行,可能是因為這會需要兩個分開的環境且會依于前面所提到的處理器在兩個模式間的乒乓效應。從Windows 3.1版開始,真實模式就消失了。
?
32位保護模式
Intel?80386推出后,也許是到目前為止x86架構的最大躍進。除了需要值得注意的Intel 80386SX是32位架構但僅只有24位尋址(和16位數據總線)。除此之外其它架構都是32位?- 所有的緩存器、指令集、輸出輸入空間和內存尋址。為了能夠在后者所說的功能工作,要使用32位擴充的保護模式。然而不像286、386所有的區段可以使用32位的偏移量,即使內存空間有使用區段,但也允許應用程序存取超過4GB空間而不需要區段的分隔。此外,32位保護模式提供分頁的支持,是一種讓虛擬內存得以實現的機制。
沒有新的通用緩存器被加入。所有16位的緩存器除了區段緩存器外都擴充為32位。Intel在緩存器的助記符號上加入“E”來表示(因此擴充的AX變成EAX,SI變成ESI,依此類推)。因為有更多的緩存器數量、指令、和運算單元,因此機器碼的格式也被擴充。為了提供與先前的架構兼容,包含執行碼的區段可以被標示為16或是32位的指令集。此外,特殊的前置符號也可以用來在16位的區段包含32位的指令碼,反之亦然。
分頁跟區段的內存存取是為了支持現在多任務操作系統所必須要的。Linux、386BSD、Windows NT和Windows 95都是一開始為386所發展,因為它是第一顆提供可靠地程序分離內存空間的支持(每個程序擁有自己的尋址空間)以及可以在必要的情況下打斷他們程序的執行(使用ring,一種x86保護模式下權力分級的名稱)。這種386的基本架構變成未來所有x86系列發展的基礎。
Intel 80386數學輔助運算處理器也在整合到這個CPU之后的x86系列中,也就是Intel 80486。新的FPU可以幫助浮點數運算,對于科學計算和圖形設計是非常重要。
轉載于:https://www.cnblogs.com/loopever/archive/2013/03/24/2979502.html
總結
- 上一篇: Codeforces Round #17
- 下一篇: 近期调优总结