1. 程式人生 > >【OS學習筆記】十四 保護模式二:段描述符

【OS學習筆記】十四 保護模式二:段描述符

上一篇文章初步進入保護模式的學習。首先學習了全域性描述符表GDT。點選連結檢視上一篇文章:全域性描述符表

本篇文章繼續學習,GDT中存放的條目:描述符,確切的說是段描述符。學習段描述符的作用以及段描述符的格式。

1、段描述符的格式

真實模式和保護模式,在記憶體訪問上是由區別的,在保護模式下,你不能說訪問哪個段就訪問哪個段,在訪問之前,必須在GDT內定義要訪問的記憶體段。這個定義就是段的描述符。

描述符不是使用者自己建立的,而是使用者程式被作業系統載入時,有作業系統根據使用者程式的結構而建立的。使用者程式是無法自己修改和建立GDT的。使用者程式只能老老實實的在自己的地盤上工作。這個時候作業系統為使用者程式建立了幾個段(定義了幾個段描述符),使用者程式就只能在這些段內工作,超出這個範圍,或者未按預定的方法訪問這些段,都將被處理器阻止。

一旦確定了GDT在記憶體中的位置,下一步就是確定要訪問的段,並在GDT中為這些段定義各自的段描述符。

如下圖,每個段描述符都是8位元組大小。圖中下面是低32位,上面是高32位。

在這裡插入圖片描述

很明顯,描述符制定了32位的段起始地址(段基地址),以及20位的段邊界。

在32位模式下,段地址與真實模式下的段地址不一樣。在真實模式先段地址不是真正的實體地址,它還需要左移4位。而保護模式下,段地址是32位的線性地址,它就是真實的實體地址(未開啟分頁功能,分頁功能後面學習)。

描述符中段基址和段界限不是連續的。這是歷史的問題與相容的問題。

20位的段界限是用來限制段的擴充套件範圍。

下面來介紹段描述符各個欄位的意思。

2、段描述符各個欄位的意義

下面的表格列出了上述段描述符的各個位的意思,如果現在不理解這些位也無所謂,後面的學習會慢慢深入理解。

G: 粒度位 用於解釋段界限的含義。當G位是0時,段界限以位元組為單位。此時段的擴充套件範圍是從1位元組到1M位元組,因為描述符中的界限值是20位的。相反,如果該位是1,那麼段界限是以4KB位單位。這樣段的擴充套件範圍是4KB到4GB
S: 類 型 位 當該位是0時,表示是一個系統;為1時,表示是一個程式碼段或者資料段(棧段也是特殊的資料段)。系統段將在後面的文章中學習
DPL 特權級 這兩位用於指定描述符的特權級。共有4中處理器支援的特權級別,分別是0、1、2、3 ,其中0是最高的特權級,3是最低的特權級別。剛進入保護模式時執行的程式碼具有最高特權級0(可以看成是從處理器那裡繼承來的)這些程式碼通常是作業系統程式碼,因此它的特權級最高。每當作業系統載入一個使用者程式,它通常都會制定一個低的特權級,比如3特權級。不同特權級的程式是互相隔離的,其訪問是嚴格限制的,而且有些處理器指令只能由0特權級的程式來執行,為的就是安全。在這裡,描述符的特權級是用於指定訪問該段所必須具有的最低特權級。
P: 段存在位 P位用於指示描述符所對應的段是否存在。一般來說,描述符所對應的段是在記憶體中。但是當記憶體空間緊張時,有可能指示建立了描述符,對應的記憶體空間並不存在,這時就應當把描述符的P位清零,表示段並不存在。另外,同樣是在記憶體空間緊張的情況下,會把很少用到的段換出到硬碟中,騰出空間給當前急需記憶體的程序使用,這時同樣要把P位清零,當再次輪到它執行時,再將其裝入記憶體,然後P位置1。 **P是由處理器負責檢查的。**每當通過描述符訪問記憶體段時,如果P位是0,處理器就會產生一個異常中斷。通常,該中斷處理過程是由作業系統提供的,該處理過程的任務是將該段從硬碟換回記憶體,並將P位置1。在多使用者、多工的系統中,這是一種常用的虛擬記憶體排程策略。
D/B: 預設的運算元大小 設定該標誌位,主要是為了能夠在32位處理器上相容執行16位保護模式的程式。 該標誌位對不同的段有不同的效果。對於程式碼段,此位稱為D位,用於指定指令中預設的的偏移地址和運算元尺寸。D=0時表示指令中的偏移地址或者運算元是16位的。D=1時,表示32位的偏移地址和運算元。對於棧段來說,該位是B位,用於在進行隱式的棧操作中(push,pop,call等),是使用SP暫存器還是使用ESP暫存器。當B=0時,在訪問哪個段時,使用SP暫存器,否則就使用ESP暫存器。同時,B位的值,也決定了棧段的上邊界。如果B=0,那麼棧的上邊界是0xFFFF;如果B=1,那麼棧段的上邊界是0xFFFFFFFF。
L:64位程式碼段標誌 保留此位給64位處理器使用。目前我們將它置0即可
TYPE:描述符子型別 對於資料段來說,這4位分別是X,E,W,A,對於程式碼段來說這4位分別是X,C,R,A。他們具體的含義見下面的表格。
AVL:軟體可以使用的位 通常由作業系統來用,處理器並不使用它。

下面表格是程式碼段和資料段的TYPE欄位

X E W A 描述符類別 含義
0 0 0 X 資料段 只讀
0 0 1 X 資料段 讀、寫
0 1 0 X 資料段 只讀,向下擴充套件
0 1 1 X 資料段 讀、寫,向下擴充套件
  • X 表示是否可執行。對於資料段,總是不可執行。所以為0
  • E 表示段的擴充套件方向。E=0是向上擴充套件的。E=1是向下擴充套件的
  • W 指示段的讀寫屬性,W=0是不允許寫入的,W=1是可以正常寫入的
  • A 是已訪問位,用於指示它所指向的段最近是否被訪問過。
X C R A 描述符類別 含義
1 0 0 X 程式碼段 只執行
1 0 1 X 程式碼段 執行、讀
1 1 0 X 程式碼段 只執行、依從的程式碼段
1 1 1 X 程式碼段 執行、讀、依從的程式碼段
  • X 表示是否可執行。程式碼段總是可執行,所以為1
  • C 指示段是否為特權級依從的。C=0時,表示非依從的程式碼段,這樣的程式碼段是可以從與它特權級相同的程式碼段呼叫,或者通過門呼叫;C=1時表示允許從低特權級的程式碼轉移到該段執行。
  • R 指示程式碼段是否允許讀出。程式碼段總是可以執行的,但是為了防止程式破壞,它是不允許寫入的。至於是否有讀出的可能,由R位決定。R=0時表示不能讀出。R=1時,則程式碼段是可以讀出的。
  • A 是已訪問位,用於指示它所指向的段最近是否被訪問過。

3、總結

今天學習段描述符的格式,以及段描述符各個欄位的含義。

筆記記得不是很全,如果有不懂的可以加我聯絡方式一起交流。

學習探討加個人:
qq:1126137994
微信:liu1126137994