80386CPU爲了給操做系統提供硬件級的可靠保護,提供了特權級保護功能。80386處於保護模式時,會改變CPU的行爲方式,其中便包括開啓特權級保護。實現良好的特權級保護是須要軟硬件相協調的,CPU提供硬件機制的同時也須要與操做系統相配合,共同實現完善的特權級保護功能。算法
要較爲全面的理解特權級保護的工做原理,須要瞭解相互關聯的各個機制。下面會介紹在80386特權級保護中起到關鍵做用的:段描述符和描述符表、保護模式下的內存訪問方式、特權級的不一樣維度與特權級校驗規則等內容。編程
在8086中,爲了可以讓程序在內存中浮動的加載裝配,經過段地址和段內偏移地址共同組成最終的物理地址。而在保護模式下,段機制依然存在,只不過爲了支持特權級保護,在一個段可以被訪問以前,須要先進行"登記註冊"。數組
用於登記註冊一個段詳細信息的數據結構被稱爲段描述符(Segment Descripter),固定佔8個字節,64位。在一個多任務系統中會定義不少不一樣的段,一個段就對應着一個段描述符,爲了統一的進行管理,須要在內存中開闢一段連續的空間集中存放緊密相連的段描述符,而這一段連續的內存空間被稱爲描述符表。緩存
描述符表有多種類型,如全局描述符表(Global Descripter Table GDT)、局部描述符(Local Descripter Table LDT)、和中斷描述符表 (Interrupt Descriptor Table IDT)等。數據結構
段描述符佔8個字節,共64位。其結構以下圖所示,上半部分是高32位、下半部分是低32位。併發
(截圖自 x86彙編語言 從實模式到保護模式)性能
段基地址是一共32位的線性地址。被分爲了物理上不連續的兩段是由於以前的80286保護模式尋址是24位的,而爲了和80286的兼容便只能在以前的段描述符設計上進行擴充。學習
在沒有開啓頁機制的狀況下,這32位的段基地址就是最終的物理地址。操作系統
段界限一共20位。被分爲兩段的緣由和段基地址同樣,都是爲了兼容以前80286的48位段描述符。段界限用於控制段的拓展範圍,在訪問時,段內偏移超過段界限時會引起錯誤。設計
對於向上拓展的段,如數據段、代碼段來講,偏移量從0開始遞增,段界限決定了段內偏移量的最大值。對於向下拓展的段,如棧段來講,偏移量從0開始遞減,段界限決定了段內偏移量的最小值。
有了段界限這一限制,在使用訪問段時,就能及時發現程序中對內存段訪問的越界行爲。更重要的是,段界限的限制可以防止程序越界,訪問本來不屬於該程序,不能被其訪問的內存空間。
G位(Granularity)粒度位,用於解釋段界限的含義。
段描述符中的段界限是20位的,咋看之下一個段的最大空間彷佛最大隻能是爲20位即1MB,這和80386的最大尋址空間4GB可不太匹配。
20位的段界限是80386的設計者爲了兼容20位尋址空間而採起的兼容性設計,而G粒度位即是其中的關鍵。當G位=0時,段界限以字節爲單位,段的最大界限就是(2^20)*1B=1MB;當G位=1時,段界限以4KB爲單位,段的最大界限擴展爲(2^20)*4KB=4GB,和80386的最大尋址範圍相匹配,此時段界限最小也是4KB。
S位(Descriptor type)類型位,用於標識當前段的類型。
當S=0時,表示當前段爲系統段;當S=1時,表示當前段是一個代碼段或數據段(棧段也被視爲特殊的數據段)。
DPL字段(Descriptor Privilege Level)表明當前段描述符的特權級,佔兩bit位。
80386共支持4種特權級級別,分別是0,1,2,3。數字越小,特權級越高,0表明最高特權級,3表明最低特權級。
P位(Segment Present)段存在位,用於標識當前段是否存在於內存中。
P=0時,表明段在內存中不存在;P=1時,表明段存在於內存之中。一般段描述符所指向的段老是位於內存中的。但有時物理內存空間緊張時,可能只是預先構造了段描述符,而沒有分配使用對應的內存空間;或者有的操做系統會在內存緊張時將不經常使用的段暫時的交互到磁盤中,騰出內存給當前正在執行的程序,以實現段式虛擬內存。
上述狀況下,段描述符的P位就應該被置爲0。CPU在對段描述符所指向的段進行訪問時,會對P位進行校驗。當發現P=0時,CPU會發出一個異常中斷,操做系統應該提供對應的中斷處理程序用於將對應內存段從磁盤中置換入內存中,同時將對應段描述符的P位置爲1。
TYPE字段共4位,用於表示段描述符的子類型。
(截圖自 x86彙編語言 從實模式到保護模式)
對於數據段來講,TYPE的4位分別是X/E/W/A位,而對於代碼段來講,TYPE的4位分別是X/C/R/A位。其中X、A位的含義是相同的,而中間的兩位因爲數據段和代碼段的性質不一樣,被賦予了徹底不一樣的含義。
既然都是內存段,如何判斷一個段是數據段仍是代碼段呢?
事實上,一個段是數據段仍是代碼段並不取決於定義時的段描述符,而取決於當前段被用於何種場景。
若是被加載在CS代碼段寄存器中,便被視爲代碼段;若是被加載在DS、ES、SS等數據段寄存器、棧段寄存器中,則被視爲數據段。
X(eXecutable)位標識當前段是否可執行。數據段老是不可執行的,所以X始終爲0;代碼段老是可執行的,所以X始終爲1。
A(Accessed)位標識當前段是否已被訪問。在段描述符初始化時,應該被設置爲0。當對應段被訪問時,由CPU硬件將A位設置爲1。操做系統在設計虛擬內存管理時,一般須要經過某些算法策略決定應該將哪些內存移入磁盤。段描述符中的A位能夠幫助操做系統判斷某一段時間內,對應段內存是否被訪問過,爲置換算法提供必定的依據。A位的清零操做也由操做系統來負責。
E(Expand)位標識數據段的拓展方向。E=0表明數據段是向上,向高地址方向拓展,通常的數據段都是向上拓展的。E=1表明數據段是向下,向低地址方向拓展,這裏主要指的就是棧段。由於入棧時,棧頂指針是自減的。
W(Writeable)位標識數據段是否可寫。數據段老是可讀的,可是不必定可寫 。W=0時,表明當前數據段不可寫,若是對當前段有寫入指令執行時,會引起CPU異常中斷。W=1時,數據段可讀可寫。
C(Confirming)位標識代碼段是不是特權級依從的。C=0表示當前代碼段是非依從的,意味着當前代碼段只能被相同特權級的程序調用(或者門調用);C=1表示當前代碼段是依從的,意味着當前代碼段容許被更低特權級的程序調用。
關於特權級依從和門調用的概念,會在後面進行進一步介紹。
R(ReadAble)位標識代碼段是不是可讀的。代碼段老是能夠執行的,但80386不容許對一個代碼段進行寫入(若是要對代碼段中的內容進行修改,應該改用一個可寫的數據段指向對應的內存空間)。同時,80386還對代碼段的可讀性作了限制。R=0時,表明該代碼段是不可讀的,尋址R=0的代碼段將會引起處理器異常中斷;R=1時,表明該代碼段是可讀的。這裏的不可讀,不是指CPU沒法讀取內存中的指令內容,而是用於限制程序軟件的行爲,例如在內存尋址中使用段超越前綴"CS:"來尋址訪問代碼段中的內容。
描述符表中最核心的是全局描述符表。從名稱中的全局二字可知,全局描述符表在80386CPU運行時是爲整個軟硬件提供服務的,只能存在一個。在進入保護模式前,須要事先定義好全局描述符表。
爲了讓CPU可以在訪問段的時候隨時定位並讀取到全局描述符表中的數據,80386提供了全局描述符表寄存器(Global Descripter Table Register GDTR)。
GDTR是48位的,高位的32位用於存放全局描述符表的起始線性地址,低位的16位用於存放GDT的界限。對GDTR賦值的彙編命令爲:lgdt m16&32。
32位的起始線性地址,最大可尋址4GB,意味着理論上GDT能夠被定義在內存的任意位置。因爲進入保護模式前須要先定義GDT,所以GDT通常被設置在實模式下可尋址的1MB內的低地址(進入保護模式後也可從新定義GDT)。
16位的界限值最大爲64KB。因爲段描述符大小爲8個字節(8B),所以GDT中能夠存放的段描述符的上限爲2^10^8=8192個,這在多數狀況下是綽綽有餘的。
現代的操做系統是多任務的,那麼什麼是任務呢?
程序是保存在存儲介質中的指令和數據的結合體,而正在執行程序的一個副本就是任務。一個程序能夠有運行在內存中的多個副本,每一個副本都是一個任務。支持多任務的操做系統要讓併發的多個任務和諧共處,就須要在任務之間經過一些手段令不一樣任務間彼此隔離。通常狀況下,不一樣任務之間的內存是不互通的,每一個任務都有本身的內存空間,一個任務不能隨意訪問另外一個任務獨有的內存空間。
80386CPU的設計者建議爲每一個任務分配獨有的描述符表,這一描述符表被稱爲局部描述符表LDT。每一個任務私有的段,其段描述符不放在GDT中,而是放在LDT中。
CPU經過能夠經過GDTR寄存器來找到GDT所在的位置。一樣的,80386提供了局部描述符表寄存器(Local Descripter Table Register LDTR)來追蹤LDT的位置。
和GDT不一樣的是,每一個任務都有着本身的LDT。在多任務輪流執行的多任務系統中,正在執行的任務被成爲當前任務,而LDTR則指向當前任務的LDT。任務切換時,LDTR中的數據會發生變化,指向新的當前任務。
前面介紹了段描述符和GDT,下面說明80386CPU在尋址時是如何與段描述符、GDT交互的。
在8086中,段寄存器存放的是段基址。CPU進行內存尋址時,16位的段基址左移4位與16位的偏移地址相加生成最終的物理地址。而在80386中,尋址方式發生了必定的變化。
80386中,段寄存器被擴展爲了兩部分。實模式下,80386段寄存器只有16位的前半部分參與工做,使用方式和8086的16位段寄存器無異,能夠兼容的運行8086程序。而在保護模式下,使用段寄存器進行內存尋址的方式發生了變化。此時,前半部分16位裝載的再也不是段基址,而是一種被稱爲段選擇子的數據結構,保護模式下段寄存器的前半部分被稱爲段選擇器;後半部分用於存儲所加載的段描述符相關數據,被稱爲描述符高速緩衝器。
此外,80386在8086的段寄存器CS/DS/ES/SS的基礎上,還新增了兩個數據段寄存器FS和GS,爲複雜彙編程序的開發提供了更好的支持。
(截圖自 x86彙編語言 從實模式到保護模式)
前面說到,保護模式下段寄存器中裝載的再也不是段基址,而是段選擇子。但CPU從本質上來講依然是經過段基址+偏移地址進行內存尋址的,只不過在中間引入了一層段選擇子的抽象,用於實現特權級保護。
段選擇子是一個16位的數據結構,由三部分組成:佔高13位的段描述符索引、TI(Table Indicator)描述符表指示器以及RPL(Request Privilege Level)請求特權級。
(截圖自 x86彙編語言 從實模式到保護模式)
描述符索引
段描述符索引用於在段描述符表中定位對應的段描述符。若是將段描述符表看做一個結構體數組,那麼描述符索引就是數組的下標。
假如段寄存器加載的是描述符表中第3個段描述符所對應的段,那當前段描述符索引的值就是0000000000010(下標從0開始)。段描述符表所能容納的最大描述符個數是8192個,13位的描述符索引剛好可以與之一一對應。
描述符表指示器TI
TI用於標識當前段描述符位於何種描述符表中。TI=0時,表示當前段位於GDT中;TI=1時,表示當前段位於LDT中。根據TI的不一樣,在加載段選擇子時,CPU將會去訪問對應的段描述符表,根據描述符索引獲取對應的段描述符信息,加載到段寄存器中。
因爲段選擇子中並無段基址、段界限等內存尋址時的關鍵數據,這些數據都只在段選擇子指向的段描述符中。但每次使用段寄存器尋址時,不能老是經過段描述符表獲取段描述符數據,頻繁的內存尋址效率過低。
所以,80386的設計者在段寄存器中設置了描述符高速緩衝器。只有當段選擇子變化時,段寄存器才須要訪問一次描述符表,獲取對應的段描述符數據,將其存入描述符高速緩衝器中。以後,對於當前同一段選擇子的訪問,即可以直接從描述符高速緩衝器中獲取數據,極大的提升了CPU經過段寄存器進行內存尋址的性能。
描述符高速緩衝器和存儲器高速緩存同樣,是純硬件控制的,沒法經過程序直接訪問、修改其中的數據。
請求特權級RPL
RPL請求特權級,標識着提供段選擇子的程序的特權級別。RPL的做用很難單獨拎出來講明,會在接下來的段特權級訪問保護機制中進行介紹。
爲了更好的保護每一個任務的LDT,防止其被其它任務隨意訪問,須要將每一個任務的LDT視爲一個須要進行特權級保護的段,將每一個任務的LDT都註冊到GDT中。
每一個任務的LDT,都有一個在GDT中的段描述符與之對應(在段描述符中S位=1的系統段)。80386CPU的LDTR被設計爲16位,其中存放的是對應LDT的段選擇子,當任務切換時,只需切換LDTR中的段選擇子便可。
經過段選擇子尋找對應段時,若是段選擇子中的TI=0,表明所要尋找的段描述符在GDT中。CPU根據GDTR中的數據,找到GDT,並按照下標計算偏移量,獲取對應的段描述符。若是段選擇子中的TI=1,表明所要尋找的段描述符在LDT中,CPU先根據當前LDTR中的段選擇子去GDT中尋找對應的LDT段描述符,從中獲取當前LDT的線性基地址。接着,再經過所請求的段選擇子中的描述符索引在LDT中查找最終所需的段描述符。
前面介紹了許多用於實現特權級保護的機制,如今終於能夠開始說明80386到底是如何利用這些機制來完成特權級保護的。
特權級保護從本質上來講,是保護高特權級的內存、外設等資源不會被沒有權限(低權限)的程序訪問。主體結構是程序訪問資源,而CPU須要在這個過程當中進行特權級的校驗。
這裏引入三種不一樣概念的特權級:當前特權級CPL、描述符特權級DPL、請求特權級RPL。
CPL當前特權級,用於表示當前所運行程序的特權級。更進一步的說,也就是當前CS代碼段寄存器中所裝載段選擇子的後兩位所決定的特權級。
BIOS在加載操做系統並進入保護模式時,處理器會在執行第一條指令時自動的將CPL設置爲0,能夠看作操做系統在進入保護模式時擁有的最高CPL是從處理器繼承而來。以後便由操做系統程序負責整個計算機系統的管理,例如加載用戶應用程序時,將用戶程序的CPL設置爲最低特權級3。應用程序雖然不但願本身被放在最低特權級,但操做系統主導了應用程序的加載,其所使用的段描述符、LDT等都由操做系統建立和管理,應用程序只能專一於本身的業務功能,無權控制本身的CPL當前特權級。
特權級分爲4種,能夠被看作幾個不一樣大小的同心圓,像一個個的指環,特權級0也被稱爲ring0。所以運行在覈心處ring0特權級的操做系統程序,也被稱爲內核(Kernel)程序。
(截圖自 x86彙編語言 從實模式到保護模式)
特權指令
80386CPU提供了一系列的機制實現特權級保護,如段描述符、GDT等等。全局描述符表GDT是特權級保護機制中的一個關鍵要素,經過指令lgdt能夠進行GDT的設置。可若是本應該被高權限的操做系統管理起來的低特權級程序(CPL=3)也能執行lgdt指令的話,整個特權級保護機制就像一幢宏偉的高樓被抽離了地基,變得脆弱不堪。
80386的設計者天然不會設計出這種百密一疏的方案。所以,在整個80386的指令集中,其中不少底層的、權限很大的指令被規定只能被最高權限的程序(例如操做系統)執行。讓CPU停機也是經過指令來完成的,若是應用程序也能隨意的執行停機指令,那將是很是恐怖的事情。
只有處於最高當前特權級CPL=0的程序纔有權限執行的指令,叫作特權指令。其中主要包括停機指令;加載GDT、LDT的指令;讀寫控制寄存器的mov指令等等。
DPL目標特權級,用於標識所指向目標的特權級。前面提到過,每一個段描述符都有DPL字段屬性。DPL特權級的高低,決定了可以被位於何種特權級的程序所訪問。
CPU對內存段訪問的特權級保護是在段選擇子加載的時進行的。當有新的段選擇子準備加載到段寄存器時,CPU會根據段寄存器的類型進行相應的校驗。
對於代碼段寄存器的來講,加載新的段選擇子可能意味着CPL的變化,校驗比較嚴格,段間控制轉移通常只容許發生在相同特權級的程序之間。也就是說,一個當前特權級CPL爲2的程序,只能跳轉到另外一個特權級DPL一樣爲2的代碼段執行,而沒法跳轉到特權級DPL爲0、一、3的代碼段。通常程序內部相同特權級代碼段間互相跳轉都是沒問題的,但還存在一些場景須要容許低特權級的程序去調用高特權級的代碼:例如低CPL的應用程序去調用高DPL的系統調用例程。
有兩種方法容許低CPL的程序跳轉高DPL的代碼段:
一是將高特權級的目標代碼段定義爲依從的,也就是將代碼段描述符中TYPE字段的C位設置爲1,表明當前代碼段是特權級依從的。當低特權級的程序跳轉至高特權級的代碼段時,CS的後兩位不發生變化,CPL和調用程序保持一致。
二是經過門來進行,門(Gate)也是一種描述符,被稱爲門描述符。門描述符區別於段描述符,段描述符描述的是一個段,而門描述符描述的是一段可執行的代碼、一個程序或者一個任務,系統調用一般使用門描述符來實現。使用jmp far指令能夠將控制經過門調用轉移到高特權級代碼段,可是依然不改變當前特權級CPL;使用call far指令則在將控制轉移到高特權級代碼段的同時,還會將當前特權級CPL提高到和目標代碼段DPL一致,也就是說,一個CPL爲3的應用程序,經過門調用調用到了一個DPL=0的代碼段程序,則CPU將會將當前特權級CPL提高爲0,和目標代碼段特權級保持一致。
數據段訪問的保護機制相對來講簡單一些:處於低CPL的程序沒法訪問高DPL的數據段。換句話說,在訪問數據段前,向數據段寄存器(DS/ES/FS/GS)載入新的段選擇子時,要求當前CPL必須高於或等於目標段DPL(數值上CPL <= DPL)。
舉個例子,在古代等級森嚴的封建制度下,皇帝能夠認爲是位於CPL=0的級別,普天之下莫非王土,皇帝能夠在本身的國家訪問任何它想要訪問的領地(數據段)。但反過來位於CPL=3的平民是無法去直接訪問皇宮的(DPL=0的數據段)。位於中間級別的CPL=一、2的程序就像地方諸侯,CPL=1的諸侯雖然也沒法直接訪問皇宮,但對於本身的寢宮(DPL=1的數據段)和平民的家(DPL=3的數據段),都是有權利訪問的。
特別的,爲了不高特權級的程序因爲棧空間不足而崩潰,處理器在特權級變化的時候,堆棧也會跟着發生變化。因此,向棧段寄存器SS載入新的段選擇子時,要求當前CPL必須徹底等於目標的DPL(在數值上CPL = DPL)。
到了這裏,看起來80386的內存保護機制彷佛已經很完善了。高特權級ring0的操做系統和低特權級ring3的應用程序彼此之間被特權級保護機制隔離開了,低特權級的應用程序不能隨意的訪問高特權級的操做系統內存;沒有提供對應的門描述符或者依從代碼段,應用程序也沒法調用高特權級的程序。
那麼80386的設計者提供的請求特權級RPL做用又是什麼呢?
RPL請求特權級,表明請求者的特權級。在執行段間控制跳轉指令時,須要提供目標代碼段的選擇子,載入CS代碼段寄存器;在訪問數據段時,也須要將數據段選擇子裝載入DS、ES等數據段寄存器中。不管是執行控制轉移,仍是訪問數據段,均可以看做是當前執行任務的一個請求,RPL也就是當前請求者的特權級。
大多數狀況下,請求者就是當前任務,所以CPL=RPL。誰負責提供段選擇子,誰就是請求者。但在某些時刻,提供段選擇子的請求者和當前任務並不相同。
咱們知道使用call far轉移指令調用操做系統提供的調用門執行系統調用時,會將CPL從應用程序的ring3提升到操做系統所處的ring0。
假如操做系統提供了一個系統調用,用於從磁盤中讀取數據,並將其寫入到應用程序數據段的指定位置中(因爲系統調用中可能會執行一些特權指令,或是外設被限制了訪問特權級,因此經過調用門call far時會提高CPL)。這個系統調用有三個參數:磁盤的扇區號(指定從磁盤的什麼位置讀取),須要寫入的數據段的段選擇子(指定寫入哪一數據段),最後一個是數據段的段內偏移地址(用於更精確的控制寫入數據的段內位置)。
這個系統調用的設計看起來還不錯,能讀取指定磁盤扇區的數據並寫入指定數據段中,但卻隱藏了一個嚴重問題。
若是應用程序的編寫者是一名惡意的攻擊者,他給出的數據段選擇子參數指向的不是應用程序本身的數據段,而是操做系統的數據段選擇子。雖然只有CPL=0的程序纔有權限訪問操做系統設置的DPL=0的內核數據段,可是因爲經過call far調用門進行系統調用時,會將CPL提高爲0,所以這個操做會被容許執行。這是一個很嚴重的漏洞,經過call far調用門實現的系統調用,模糊了CPL和事實上的請求者特權級的關係,使得只有CPL、DPL的校驗機制在這種狀況下顯得無能爲力。CPU很難區分出在段選擇子的加載時,這個段選擇子到底是操做系統提供的仍是惡意應用程序提供的。
所以,80386的設計者在CPL、DPL的基礎上又提供了RPL請求特權級來解決這個問題。雖然CPU不知道段選擇子的提供者是誰,但操做系統是知道的。操做系統在內核中訪問內存段時,請求者天然是操做系統本身;而操做系統提供系統調用爲應用程序服務時,也能明確知道請求者是低特權級的應用程序。
在上述磁盤讀取系統調用的例子中,操做系統能夠在系統調用的程序中修改應用程序提供的段選擇子的RPL,將其設置爲和應用程序匹配的低特權級後再送入段寄存器中。CPU在校驗時,除了要求CPL高於或等於目標段的DPL(數值上CPL <= 目標DPL),也要求給出的段選擇子中的RPL也必須高於或等於目標段的DPL(數值上RPL <= 目標DPL)。
引入了RPL後,而且操做系統在系統調用中合理的設置了段選擇子的RPL,上述漏洞就不復存在了。正常的應用程序可以訪問磁盤數據,並正確的寫入本身的數據段中(CPL=0 RPL=3,目標DPL=3 校驗經過);但惡意的應用程序即便傳入的段選擇子RPL=0,也會被系統調用給重置爲RPL=3,非法訪問操做系統內核數據段的企圖將會被CPU發現,引起異常中斷(CPL=0 RPL=3,DPL=0 校驗不經過)。
前面的舉例分析中,或多或少的介紹了幾種內存訪問時的特權級保護校驗規則,這裏系統的總結一下。內存特權級保護的規則根據內存段的性質不一樣,有必定差別,分狀況討論。
非特權級依從代碼段直接轉移: 直接控制轉移到非特權級依從的代碼段時,要求當前特權級CPL、請求特權級RPL都等於目標代碼段DPL(數值上CPL = 目標代碼段DPL,RPL = 目標代碼段DPL)。
特權級依從代碼段直接轉移:直接控制轉移到特權級依從的代碼段時,要求當前特權級CPL、請求特權級RPL都低於或等於目標代碼段DPL(數值上CPL >= 目標代碼段DPL,RPL >= 目標代碼段DPL)。
門描述符特權轉移:經過門描述符進行的控制轉移規則較爲複雜,在後續關於門描述符的博客再對門描述符控制轉移的規則再進行展開介紹。
CPU容許高當前特權級的程序訪問低特權級別的數據段。換句話說,低當前特權級的程序沒法訪問高特權級的數據段。
即要求當前特權級CPL,請求特權級RPL都必須高於或等於目標數據段DPL(數值上CPL <= 目標數據段DPL,RPL <= 目標數據段DPL)。
CPU要求任什麼時候候,訪問的棧段特權級必須和當前特權級CPL相一致。
即要求當前特權級CPL,請求特權級RPL都必須等於目標棧段DPL(數值上CPL = 目標棧段DPL,RPL = 目標棧段DPL)。
在經過學習《x86彙編語言 從實模式到保護模式》以及有關內容的博客,掌握了必定的80386硬件及彙編知識後,我才具有了閱讀、學習ucore操做系統源碼的基礎。雖然《x86彙編語言 從實模式到保護模式》的做者在不少地方都很體貼的站在初學者的角度來說解原理,但一方面因爲本身在閱讀時不夠專一,另外一方面也和涉及到的知識點繁多且關係緊密有關。對我而言,單純經過閱讀學習的效果並非特別理想。
《暗時間》一書中提到了兩個頗有價值的觀點:書寫是爲了更好的思考、教是更好的學。在寫博客的過程當中,會不自覺的反覆思考並總結所寫的內容,找到那些自覺得了解但事實上卻理解不夠深入的內容。同時假設有一個虛擬的初學者會閱讀所寫的博客,換位思考這個虛擬的初學者可能遇到的問題,儘量的將內容以淺顯易懂的方式說清楚。固然,若是博客能幫助到和我同樣,對CPU硬件、操做系統原理感興趣的小夥伴就更好了。
對於學習基於x86保護模式的ucore乃至流行的Linux、Windows等操做系統來講,x86CPU的特權級保護機制是相當重要的一部分。有了硬件級別的特權級保護機制,才能實現多任務的隔離以及各類軟件級別的權限控制。後續的80386學習相關博客將會包括門描述符的詳細介紹以及分頁機制、虛擬內存管理等相關的知識點,這些內容都是學習ucore操做系統公開課時所必須的。
做爲一個初學者,博客中若有錯誤或者理解不到位的地方,還請指正。