一.80386CPU介紹
Inter80386CPU是Inter公司於1985年推出的第一款32位80x86系列的微處理器。80386的數據總線是32位的,其地址總線也是32位,因而最大可尋址4GB的存儲空間。
80386作為x86系列CPU的一員,保持着對更早生產的x86CPU的向前兼容。80386在當時主要為支持高性能的應用領域和多用戶、多任務操作系統而設計,提供了硬件級的特權級保護、多任務切換、內存分頁等功能。
80386有三種運行模式:實模式、保護模式和虛擬8086模式。
在實模式下,80386和8086的行為保持一致,只能訪問20位(1M)的地址空間,內部實際32位的寄存器也只有低16位有效。實模式主要是為了兼容運行在8086CPU上的程序,所以80386加電后,默認就運行在實模式下。
要想充分發揮80386的對於多任務的支持功能,需要使80386進入保護模式。保護模式是80286以及后續的x86CPU都具有的一種工作模式。保護模式下的80386內存尋址范圍達到了硬件設計的上限:2^32byte,即4GB。保護模式提供了諸如內存保護、內存分頁機制以及硬件虛擬存儲管理等功能,為多用戶。多任務的高效、可靠、安全的操作系統實現提供了良好的支持。因此,主流的現代操作系統例如Linux、Windows(Windows95及以后)其內核均運行在x86的保護模式之上。
虛擬8086模式的工作模式介於實模式和保護模式之間,虛擬8086支持多任務、內存分頁等功能。但運行的每一個獨立任務均處於實模式之下。虛擬8086這一模式由於其中庸性,應用范圍相對較小。
二.80386對於8086的主要改進
80386能夠兼容的運行之前在8086、80286CPU上運行的程序,但80386比起16位的8086CPU無論是性能還是功能上都有質的提升。
性能方面的主要改進:
更寬的數據總線和地址總線
擴展到32位的地址總線使得80386能夠訪問更大的地址空間,同時32位的數據總線比起8086的16位也增加了數據的傳輸速度。
高速緩存
80386在CPU內部增加了對於內存的高速緩存器。高速緩沖存儲器會攔截所有對於內存的訪問,並判斷所需數據是否已經存在於高速緩存中。
如果緩存命中,則直接將高速緩存中的數據交給CPU;如果緩存未命中,則進行常規的存儲器訪問,獲取數據交給CPU的同時也將數據存入高速緩存。由於高速緩存距離CPU更近,訪問性能也強於主存等外部存儲器(至少一個數量級),由於局部性原理,使用高速緩存能夠極大的提高CPU訪問內存的效率。
指令流水線
雖然CPU是按照順序進行機器指令的執行,表面上看必須一條指令執行完才能執行下一條指令。但事實上,在一條機器指令完整的執行過程中,內部也可分為多個步驟。
例如在80386CPU中,就將一條指令的執行分為三個小步驟:取址,譯碼和執行,理想情況下每個步驟都會耗費大約一個時鍾周期。
在福特的流水線汽車生產過程中,為首的工人們負責制造汽車的骨架;中間的工人負責加裝車門、輪胎等;流水線尾端的工人則負責刷漆、裝潢等。安裝車門的工人不需要等待尾端的工人將當前的汽車刷漆完畢后,便可提前進行下一輛車車門、輪胎的安裝,比起傳統的手工作坊那種從頭到尾,阻塞式的生產方式,流水線的生產效率要高得多。
CPU的設計者正是從流水線式工廠生產中獲取了靈感,對CPU的指令執行過程進行了流水線優化。將CPU執行硬件指令的過程比作一輛汽車的生產,CPU內部的執行單元在執行指令時,取址器件同時可以提前的將下一條指令提前的從存儲器或是高速緩存中讀取。流水線式的指令執行過程,使得取址、譯碼和執行單元時時刻刻在飽和的工作着,減少了不必要的等待時間,提高了CPU整體的執行效率。
隨着CPU的發展,更先進的CPU將指令執行的流水線步驟分解的更加細致,以應對越來越高的主頻、越來越短的時鍾周期。例如下一代的80486CPU便將指令流水線由之前的3步進一步分解為了5步(取指令,一級譯碼,二級譯碼,執行,寫回結果),而如今最先進的CPU的流水線深度甚至已經達到了驚人的十幾甚至幾十。
cpu指令流水線技術就是一種將指令分解為多步,讓不同指令的各步操作重疊,從而實現幾條指令的並行處理,以加速程序運行過程的技術。
功能方面的主要改進:
優先級保護
在8086CPU下,應用程序可以隨意的訪問地址空間中的任意位置,惡意的攻擊程序甚至能夠修改屬於操作系統內核的代碼、數據,造成巨大的破壞。
在多任務、多用戶的系統軟件需求下,操作系統等系統級軟件的設計者迫切的希望CPU硬件能提供一些必要的功能以保護內存、外設,避免運行良好的程序被其它程序、其它用戶有意無意的破壞。畢竟軟件的絕大多數功能都是依賴硬件的,如果沒有硬件的幫助,單獨軟件層的保護實現會是漏洞百出的。
為此80286以及之后的x86CPU提供了一系列的,主要圍繞特權級權限的保護功能。這些功能必須處於保護模式下才能使用,這也是保護模式名稱的由來。
80386能夠為不同的程序段、數據段以及棧段賦予不同的特權級,由兩個bit位決定,00、01、10、11這四種,數字越小權限越高。舉個例子,高運行特權級的程序能夠訪問同級或更低訪問特權級的數據段,反之低運行特權級的程序則無法直接訪問高訪問特權級的數據段。
BIOS在導入操作系統時,操作系統會將自己設置為最高優先級00,而被操作系統加載的用戶應用程序則會被操作系統設置為更低的特權級11,這樣就不會出現8086中應用程序能直接修改操作系統內核數據的問題。介於其中的01、10特權使用的並不是很多,比較關鍵的設備驅動程序,虛擬機程序可能會被設置為高於應用程序,但低於宿主操作系統的程序特權級。
這里對80386特權級保護機制的介紹非常籠統,屏蔽了很多細節,關於特權級保護會在后面的博客中進行更詳細的介紹。
存儲器分頁管理機制
在保護模式下,80386可以開啟存儲器分頁管理功能。開啟了分頁管理功能的80386,會將物理內存分隔為4KB固定大小的頁。
在未開啟頁機制時,線性地址就是最終的物理地址;而開啟了頁機制后,線性地址還需要通過頁表進行映射轉換才能獲得最終的物理地址。
那么CPU會提供分頁機制來對線性地址到真實物理地址的轉換做一步抽象呢?這主要是為了給操作系統提供虛擬內存管理功能提供方便。在虛擬內存管理中,操作系統能夠將暫時不用的程序內存,放入磁盤的swap交換區域,並在需要時又從磁盤換回內存。這樣每個程序看起來都獨占了很大的一片內存(虛擬內存),其總和可能遠大於物理內存實際容量,這就是虛擬內存管理帶來的好處。
更早時期的操作系統設計者會在新程序加載,而物理內存不足時將某些非運行的程序內存整體的換出到磁盤。在提供了頁機制后,換出的粒度就控制在4KB的頁這一級別,效果會好很多,因為根據局部性原理,在某一時刻一個程序內部不同片段被訪問的頻率具有很大差異,只將不常用的內存換出,省去任務切換時的磁盤IO帶來的性能提升是巨大的。
80386頁表中的頁表項記錄着當前頁是否處於物理內存中,當尋址最終映射訪問的內存頁不在物理內存中,CPU會觸發缺頁中斷異常。頁內存訪問不存在時發出缺頁中斷異常完全是由CPU硬件完成的,操作系統在實現虛擬內存管理時,需要提供對應的內存缺頁中斷處理程序,將對應的缺頁內存換入物理內存。缺頁中斷機制是硬件級別的,因此效率將高於純粹由程序軟件實現的分頁功能。
和特權級保護一樣,這里也屏蔽了諸如頁表、頁表項的數據結構詳情,程序邏輯地址訪問時轉換為物理地址的完整過程,以及頁表寄存器等等細節。存儲器分頁管理機制也將在后續的博客中展開介紹。
三.總結
為了更好的學習ucore操作系統的課程,最近一段時間通過閱讀《x86匯編語言 從實模式到保護模式》、《微型計算機硬件及技術 微機原理》等書和博客,學習和了解了關於80386CPU相關的硬件知識和匯編語言。以寫博客的方式,對最近的學習進行一個系統的總結,加以鞏固,以適應操作系統課程內容的學習。
計算機體系的很多核心知識是一環扣一環的,如同一張綿密的網。沒有8086CPU相關知識的基礎,學習80386將遇到不小的困難;如果沒有學習80386CPU相關的知識,去掌握基於80386CPU的操作系統時也會感到迷茫。更進一步的,沒有一個良好的關於操作系統的認知,在學習JVM、網絡協議、數據庫等基於操作系統的內容時,也會遇到很多麻煩,導致理解的不夠深刻。
希望通過不斷的學習,有朝一日能在學習各種技術、遇到各種技術問題時從不同層面進行分析,並納入自己的知識體系中,與已有知識結合起來。