內存管理寄存器
處理器提供了四個內存管理寄存器(GDTR、LDTR、IDTR、TR),用于指定分段內存管理所使用的系統表的基地址。
1 全局描述符表寄存器GDTR
GDTR寄存器用于 存放全局描述符表GDT的32位線性基地址和16位表長度。基地址指定GDT表中字節0在線性地址空間中的地址。
表的長度指明GDT表的字節長度值。 在保護模式初始化的時候,必須給該寄存器加載一個新值。
2 中斷描述符寄存器 IDTR
與全局描述符寄存器類似,IDTR存儲中斷描述符表的IDT的32位基地址,長度表示中描述符表的長度值。
3 局部描述符表寄存器 LDTR
LDTR用于存儲局部描述符表LDT的32位線性基地址,16位段限長以及 描述符屬性值。
4 任務寄存器 TR
TR寄存器用于存儲當前任務TSS段的16位段選擇符、32位基地址、16位段長度和描述符屬性值。
5 為了進行內存尋址,8086使用了一種稱為段 的尋址方式,這種技術把內存分成了一個一個的段,從而要訪問內存中的數據,就需要知道段的起始地址和
段內偏移地址。段地址部分使用使用16位的段選擇符來表示。段偏移地址使用32位的值來指定,因此段內地址可以使0 - 4G 。程序中使用一個48位的地址或長指針
成為一個邏輯地址。它唯一的確定一個內存對象的段地址和段內偏移地址。
二 地址變換
1 8086的地址變換方式
第一階段,使用分段機制把程序的邏輯地址變換到處理器可尋址的內存空間(線性地址空間)
第二階段,使用分頁機制把線性地址變為物理地址 。 物理地址: 處理器在其地址總線上能夠產生的地址范圍。
2 分段提供了隔絕各個代碼、數據和堆棧區域的機制,因此多個程序可以運行在同一個處理器上而不會相互干擾。
為了定位指定段中的一個字節,程序必須提供一個邏輯地址。邏輯地址包括一個段選擇符和一個偏移量。段選擇符是一個
段的唯一標示。
另外段選擇符提供了段描述符表中的一個數據結構的偏移量。每個段都有一個段描述符, 段描述符指定段的大小、
訪問權限和段的特權級、段類型以及段的第一個字節所在線性地址空間中的位置。邏輯地址的偏移量部分加到段的基地址上就可
以定位段中某個字節的位置。
3 分頁機制
分頁機制主要目的就是為了,采用虛擬化的技術。
分頁和分段都使用了兩種不同的地址變換機制,它們對整個地址變換操作提供了獨立的處理階段。
兩種機制使用了存儲在內存中的變換表,但所用的表結構不同。 實際上段表存儲在線性地址空間
,而頁表存儲在物理地址空間。
三 保護
1 任務之間的保護
8086采用的方法是把每個任務放置在不同的虛擬地址空間中,并給予每個任務不同的邏輯地址到物理地址的變換映射。
每個任務間的地址變換功能被定義成一個任務中的邏輯地址映射到物理地址空間中的一部分區域,而另一個任務映射到物理地址空間
中的另一部分區域 。 每個任務都有各自獨立的映射表,當處理器切換去執行一個新任務時,任務切換的關鍵部分就是切換到新任務的變換表。
2 特權級保護
特權級用數字0 到3 表示,0是最高特權級,3是最低特權級。
四 分段機制
1 每個段由三個參數定義:
(1) 段基地址 ,指定段在線性地址空間中的開始地址。
(2) 段限長 , 虛擬地址空間中段內最大可用偏移位置。
(3) 段屬性 , 指定段的屬性。 例如該段是否可以讀或者寫是否可以作為一個程序執行,段的特權級。
上述三個字段存儲在段描述符結構項中。 段描述符存儲在段描述符表中。段描述符表是包含段描述符的一個數組,
段選擇符則是指定表中一個段描述符的位置來指定相應的段。
2 段描述符表
該表是段描述符的一個數組,且有兩種描述符表,全局GDT 和 局部 LDT 兩種。
3 段選擇符
段選擇符并不是直接的指向段,而是指向段描述符表中的段描述符。

上圖為段選擇符的結構 。 在編程過程中 , cs ss , ds ,fs , gs ,es等段寄存器存儲段選擇符。
若要訪問某個段的程序,必須已經把段選擇符加載到一個段寄存器中。因此,盡管一個系統能夠定義很多的段
但是同時只能有6個段可供立即訪問。
4 段描述符
每個段描述符是段描述符表的一個數據結構,用于向處理器提供一個段的位置和大小信息以及訪問狀態的信息。每個段選擇符是8個字節。含有
三個主要字段,段基地址、斷限長度和段屬性。下圖為段描述符的一般結構圖。8個字節大小

4.1 代碼段和數據段描述符類型
TYPE字段是不同的。
關于代碼段的一致性和非一致性
所謂的“一致代碼段”,目的是為了共享,比如該一致代碼段的特權級是2,那么即使是特權級是3的代碼,也可以訪問該一致代碼。也就是允許低權限的代碼訪問 高權限的代碼,而成功訪問之后,當前的特權級并不是目標代碼的特權級,而是原來代碼的特權級,也就是說,跳轉之后,CPL不變。要注意的是,一致代碼段的 DPL的定義,它定義的是允許訪問改一致代碼段的最高權限,也就是說,如果一個權限比一致代碼段中DPL的權限還要高的話,是不允許訪問該一致代碼段的。
總結:一致代碼段的DPL規定了成功訪問它的最高權限,高于這個權限的代碼不能成功訪問它。成功訪問一致代碼段后,CPL并不會改變,還是保持為原來的權限。這樣的設置主要是為了共享,比如一些函數庫之類的,而不用受到權限的限制.
對于非一致代碼段,要求CPL=DPL,RPL<=DPL.
對于非一致代碼段,只允許同特權級的轉移
原因:
1.低特權級下不能調用高特權級的代碼,即保護高特權級的代碼.
2.高特權級下不能調用低特權級的代碼,為了避免低特權級代碼獲得高特權級從而能執行某些系統指令.
1.
一致代碼段的轉移,轉移后的CPL不變
對于非一致代碼段的轉移與通過調用門轉移,轉移后的CPL就是段的DPL.
5 分頁機制
處理器分頁機制將會把 線性地址 轉變成 物理地址 。 根據CR0寄存器的PG位,來判斷使用分頁機制。
一個頁面的大小事12位,所以線性地址空間的低12位可以直接作為頁內偏移量,即物理地址。分頁機制執行的重定位功能可以看做
是把線性地址的高20位,轉換到物理地址空間的高20位。
5.1 頁表結構
分頁功能由駐留在內存中的表來描述,該表稱為頁表,存放在物理內存空間中。線性到物理地址的映射功能可以看做是進行數組查找,
線性地址空間的高20位構成這個數組的索引值,用于選擇對應頁面的物理基地址。這就意味著高20位的頁面基地址和12位偏移量組合在一起
就能得到對應的物理地址。
5.1.1 兩級頁表項結構
頁表含有2 的20次方個表項,每項占用4字節,要是作為一個表來存放的話,那就占用了4M內存。為了減少內存的使用,8086使用了2 級表。
由此,高20位線性地址地址到物理地址的轉換就被分成了兩步來進行,每步轉換使用其中的10位。

第一級頁表稱為頁目錄表,它存放在1頁4KB的頁面中,這些表項指向對應的二級表,線性地址空間的最高10位用作一級表中的索引值來選擇1024 個二級表。
第二級表項中,存儲的是物理地址的高20位。 二級頁表使用線性地址空間的中間10位來索引二級頁表。二級頁表中的20位頁面物理基地址再加上最后12位基地址,就構成了最終的物理地址。
其中
CR3指定的頁目錄表的物理基地址。
頁目錄表中也有一個屬性來決定是否存在對應得二級頁表項。也就是說二級頁表不一定存在內存中,當需要的時候可以再加入內存。
5.1.2頁表項格式
5.1.3 虛擬內存
頁表項的一些字段為虛擬內存提供了便利條件,諸如 已訪問標志和已修改標志和存在位。