【OS学习笔记】十四 保护模式二:段描述符
上一篇文章初步進入保護模式的學習。首先學習了全局描述符表GDT。點擊鏈接查看上一篇文章:全局描述符表
本篇文章繼續學習,GDT中存放的條目:描述符,確切的說是段描述符。學習段描述符的作用以及段描述符的格式。
1、段描述符的格式
實模式和保護模式,在內存訪問上是由區別的,在保護模式下,你不能說訪問哪個段就訪問哪個段,在訪問之前,必須在GDT內定義要訪問的內存段。這個定義就是段的描述符。
描述符不是用戶自己建立的,而是用戶程序被操作系統加載時,有操作系統根據用戶程序的結構而建立的。用戶程序是無法自己修改和建立GDT的。用戶程序只能老老實實的在自己的地盤上工作。這個時候操作系統為用戶程序建立了幾個段(定義了幾個段描述符),用戶程序就只能在這些段內工作,超出這個范圍,或者未按預定的方法訪問這些段,都將被處理器阻止。
一旦確定了GDT在內存中的位置,下一步就是確定要訪問的段,并在GDT中為這些段定義各自的段描述符。
如下圖,每個段描述符都是8字節大小。圖中下面是低32位,上面是高32位。
很明顯,描述符制定了32位的段起始地址(段基地址),以及20位的段邊界。
在32位模式下,段地址與實模式下的段地址不一樣。在實模式先段地址不是真正的物理地址,它還需要左移4位。而保護模式下,段地址是32位的線性地址,它就是真實的物理地址(未開啟分頁功能,分頁功能后面學習)。
描述符中段基址和段界限不是連續的。這是歷史的問題與兼容的問題。
20位的段界限是用來限制段的擴展范圍。
下面來介紹段描述符各個字段的意思。
2、段描述符各個字段的意義
下面的表格列出了上述段描述符的各個位的意思,如果現在不理解這些位也無所謂,后面的學習會慢慢深入理解。
| 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字段
| 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 是已訪問位,用于指示它所指向的段最近是否被訪問過。
| 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
總結
以上是生活随笔為你收集整理的【OS学习笔记】十四 保护模式二:段描述符的全部內容,希望文章能夠幫你解決所遇到的問題。