天天看點

從Inter CPU體系讨論實模式與保護模式實模式保護模式

1971年11月15日,這一天被當作全球IT界具有裡程碑意義的日子而被寫入許多計算機專業教科書。INTEL公司的工程師霍夫發明了世界上第一個微處理器—4004,這款4位微處理器雖然隻有45條指令,而且每秒隻能執行5萬條指令。甚至比不上1946年世界第一台計算機ENIAC。但它的內建度卻要高很多,一塊4004的重量還不到一盅司。緊接着在1972年8008誕生,世界上第一款八位元處理器,擁有14位位址總線與14位資料總線.之後還有8080,8位元處理器,擁有16位位址總線和八位資料總線。8085同樣也是8位處理器。至此,記憶體尋址通路仍是絕對位址。就是指令的位址即實體位址,中間沒有任何的轉換。而8080的誕生作為公認的“第一款真正可用的微處理器”。8080的架構對8086産生了很大的影響,并且為 x86系列奠定了基礎,才有了我們今天要提到的實模式與保護模式。

從Inter CPU體系讨論實模式與保護模式實模式保護模式
從Inter CPU體系讨論實模式與保護模式實模式保護模式

實模式

1976年開始設計,1978年中旬Intel 釋出了 8086。标志了x86王朝的開始。它是一款16位的微處理器,卻被設計成可以通路1MB 的記憶體(即20位的位址空間)。問題就産生了,16位的 ALU怎麼去取20位的位址呢?

8086采用段式管理,添加了CS(Code Segment代碼段寄存器) DS(Data Segment資料段寄存器) SS(是 Stack Segment堆棧段寄存器)ES(Extra Segment附加段寄存器)。這四個段寄存器均為16位且存儲的是目前操作的段的起始位址。由于CPU隻能尋址16位,每個段的限長是64k。為了取20位的位址,8086規定,段的起始位置必須是是16的倍數,這樣每個段的起始位置後四位都是0。寄存器隻記錄位址的高16位。現在我們隻需要起始位址左移四位再加上偏移量(偏移量存在IP(指令指針寄存器Instruction Pointer)中)就可以找到實體位址啦。而這種模式就是傳說中的實模式。

以DS段為例:

從Inter CPU體系讨論實模式與保護模式實模式保護模式

然而實模式有一個缺陷,通過改變段寄存器的值,我們可以随心所欲的通路記憶體任何一個單元,而絲毫不受到限制,不能對記憶體通路加以限制,也就談不上對系統的保護。是以,在實模式下是無法構造現代意義的作業系統的。

于是乎為了解決這個問題,inter 通過了80286的過渡(盡管在Intel 80286手冊中已經提出了保護模式,但實際上它隻是一個指引。80286雖然有了保護模式但其依然是16位的CPU,其通用寄存器還是16位寬,隻不過其位址線由20位變成了24位,即尋址空間擴大到了16MB(但受限于寄存器位寬,單個寄存器的尋址空間仍然為64KB)。80286隻是一個“過渡”産品,很快就被淘汰。),釋出了80386,80386完全相容先前的 8086/8088,80186,80286,并且 80386 全面支援 32 位資料類型和 32 位操作,并且 80386 的資料總線根數和位址總線根數均達到了 32 根,進而可以最大實體尋址為 232 即 4GB 。它支援實模式,也提供了保護模式。

保護模式

保護模式下位址的表示方式與實模式是一樣的,都是:段+偏移,不過保護模式下,“段”的概念發生了根本性的改變。實模式下,段值還是可以看作是位址的一部分,比如段值為xxxxh表示以xxxx0h開始的一段記憶體。而保護模式下,雖然段值仍然由原來的CS、DS等寄存器表示,但此時它僅僅變成了一個索引,這個索引指向了一個資料結構的一個表項,表項中詳細定義了段的段基址,段界限,段屬性等内容。這個資料結構就是段描述符GDT與LDT。

從Inter CPU體系讨論實模式與保護模式實模式保護模式
從Inter CPU體系讨論實模式與保護模式實模式保護模式

段選擇子就是寄存器CS DS SS 中的值,其高13位即為段描述符的索引,後3位存儲系統預設值

于是我們可以得到(以CS索引的GDT為例)

段基址= = GDTR[CS>>3].BaseAdress

線性位址 == 段基址 + IP(IP<=段界限)

若系統未開啟分頁機制,此處的線性位址就是實體位址

反之,此處的線性位址隻是虛拟位址,還需要通過映射找到實體位址此處不再贅述。

從Inter CPU體系讨論實模式與保護模式實模式保護模式

繼續閱讀