【OS学习笔记】十四 保护模式二:段描述符
上一篇文章初步進(jìn)入保護(hù)模式的學(xué)習(xí)。首先學(xué)習(xí)了全局描述符表GDT。點(diǎn)擊鏈接查看上一篇文章:全局描述符表
本篇文章繼續(xù)學(xué)習(xí),GDT中存放的條目:描述符,確切的說是段描述符。學(xué)習(xí)段描述符的作用以及段描述符的格式。
1、段描述符的格式
實(shí)模式和保護(hù)模式,在內(nèi)存訪問上是由區(qū)別的,在保護(hù)模式下,你不能說訪問哪個(gè)段就訪問哪個(gè)段,在訪問之前,必須在GDT內(nèi)定義要訪問的內(nèi)存段。這個(gè)定義就是段的描述符。
描述符不是用戶自己建立的,而是用戶程序被操作系統(tǒng)加載時(shí),有操作系統(tǒng)根據(jù)用戶程序的結(jié)構(gòu)而建立的。用戶程序是無法自己修改和建立GDT的。用戶程序只能老老實(shí)實(shí)的在自己的地盤上工作。這個(gè)時(shí)候操作系統(tǒng)為用戶程序建立了幾個(gè)段(定義了幾個(gè)段描述符),用戶程序就只能在這些段內(nèi)工作,超出這個(gè)范圍,或者未按預(yù)定的方法訪問這些段,都將被處理器阻止。
一旦確定了GDT在內(nèi)存中的位置,下一步就是確定要訪問的段,并在GDT中為這些段定義各自的段描述符。
如下圖,每個(gè)段描述符都是8字節(jié)大小。圖中下面是低32位,上面是高32位。
很明顯,描述符制定了32位的段起始地址(段基地址),以及20位的段邊界。
在32位模式下,段地址與實(shí)模式下的段地址不一樣。在實(shí)模式先段地址不是真正的物理地址,它還需要左移4位。而保護(hù)模式下,段地址是32位的線性地址,它就是真實(shí)的物理地址(未開啟分頁功能,分頁功能后面學(xué)習(xí))。
描述符中段基址和段界限不是連續(xù)的。這是歷史的問題與兼容的問題。
20位的段界限是用來限制段的擴(kuò)展范圍。
下面來介紹段描述符各個(gè)字段的意思。
2、段描述符各個(gè)字段的意義
下面的表格列出了上述段描述符的各個(gè)位的意思,如果現(xiàn)在不理解這些位也無所謂,后面的學(xué)習(xí)會慢慢深入理解。
| S: 類 型 位 | 當(dāng)該位是0時(shí),表示是一個(gè)系統(tǒng);為1時(shí),表示是一個(gè)代碼段或者數(shù)據(jù)段(棧段也是特殊的數(shù)據(jù)段)。系統(tǒng)段將在后面的文章中學(xué)習(xí) |
| DPL 特權(quán)級 | 這兩位用于指定描述符的特權(quán)級。共有4中處理器支持的特權(quán)級別,分別是0、1、2、3 ,其中0是最高的特權(quán)級,3是最低的特權(quán)級別。剛進(jìn)入保護(hù)模式時(shí)執(zhí)行的代碼具有最高特權(quán)級0(可以看成是從處理器那里繼承來的)這些代碼通常是操作系統(tǒng)代碼,因此它的特權(quán)級最高。每當(dāng)操作系統(tǒng)加載一個(gè)用戶程序,它通常都會制定一個(gè)低的特權(quán)級,比如3特權(quán)級。不同特權(quán)級的程序是互相隔離的,其訪問是嚴(yán)格限制的,而且有些處理器指令只能由0特權(quán)級的程序來執(zhí)行,為的就是安全。在這里,描述符的特權(quán)級是用于指定訪問該段所必須具有的最低特權(quán)級。 |
| P: 段存在位 | P位用于指示描述符所對應(yīng)的段是否存在。一般來說,描述符所對應(yīng)的段是在內(nèi)存中。但是當(dāng)內(nèi)存空間緊張時(shí),有可能指示建立了描述符,對應(yīng)的內(nèi)存空間并不存在,這時(shí)就應(yīng)當(dāng)把描述符的P位清零,表示段并不存在。另外,同樣是在內(nèi)存空間緊張的情況下,會把很少用到的段換出到硬盤中,騰出空間給當(dāng)前急需內(nèi)存的進(jìn)程使用,這時(shí)同樣要把P位清零,當(dāng)再次輪到它執(zhí)行時(shí),再將其裝入內(nèi)存,然后P位置1。 **P是由處理器負(fù)責(zé)檢查的。**每當(dāng)通過描述符訪問內(nèi)存段時(shí),如果P位是0,處理器就會產(chǎn)生一個(gè)異常中斷。通常,該中斷處理過程是由操作系統(tǒng)提供的,該處理過程的任務(wù)是將該段從硬盤換回內(nèi)存,并將P位置1。在多用戶、多任務(wù)的系統(tǒng)中,這是一種常用的虛擬內(nèi)存調(diào)度策略。 |
| D/B: 默認(rèn)的操作數(shù)大小 | 設(shè)置該標(biāo)志位,主要是為了能夠在32位處理器上兼容運(yùn)行16位保護(hù)模式的程序。 該標(biāo)志位對不同的段有不同的效果。對于代碼段,此位稱為D位,用于指定指令中默認(rèn)的的偏移地址和操作數(shù)尺寸。D=0時(shí)表示指令中的偏移地址或者操作數(shù)是16位的。D=1時(shí),表示32位的偏移地址和操作數(shù)。對于棧段來說,該位是B位,用于在進(jìn)行隱式的棧操作中(push,pop,call等),是使用SP寄存器還是使用ESP寄存器。當(dāng)B=0時(shí),在訪問哪個(gè)段時(shí),使用SP寄存器,否則就使用ESP寄存器。同時(shí),B位的值,也決定了棧段的上邊界。如果B=0,那么棧的上邊界是0xFFFF;如果B=1,那么棧段的上邊界是0xFFFFFFFF。 |
| L:64位代碼段標(biāo)志 | 保留此位給64位處理器使用。目前我們將它置0即可 |
| TYPE:描述符子類型 | 對于數(shù)據(jù)段來說,這4位分別是X,E,W,A,對于代碼段來說這4位分別是X,C,R,A。他們具體的含義見下面的表格。 |
| AVL:軟件可以使用的位 | 通常由操作系統(tǒng)來用,處理器并不使用它。 |
下面表格是代碼段和數(shù)據(jù)段的TYPE字段
| 0 | 0 | 0 | X | 數(shù)據(jù)段 | 只讀 |
| 0 | 0 | 1 | X | 數(shù)據(jù)段 | 讀、寫 |
| 0 | 1 | 0 | X | 數(shù)據(jù)段 | 只讀,向下擴(kuò)展 |
| 0 | 1 | 1 | X | 數(shù)據(jù)段 | 讀、寫,向下擴(kuò)展 |
- X 表示是否可執(zhí)行。對于數(shù)據(jù)段,總是不可執(zhí)行。所以為0
- E 表示段的擴(kuò)展方向。E=0是向上擴(kuò)展的。E=1是向下擴(kuò)展的
- W 指示段的讀寫屬性,W=0是不允許寫入的,W=1是可以正常寫入的
- A 是已訪問位,用于指示它所指向的段最近是否被訪問過。
| 1 | 0 | 0 | X | 代碼段 | 只執(zhí)行 |
| 1 | 0 | 1 | X | 代碼段 | 執(zhí)行、讀 |
| 1 | 1 | 0 | X | 代碼段 | 只執(zhí)行、依從的代碼段 |
| 1 | 1 | 1 | X | 代碼段 | 執(zhí)行、讀、依從的代碼段 |
- X 表示是否可執(zhí)行。代碼段總是可執(zhí)行,所以為1
- C 指示段是否為特權(quán)級依從的。C=0時(shí),表示非依從的代碼段,這樣的代碼段是可以從與它特權(quán)級相同的代碼段調(diào)用,或者通過門調(diào)用;C=1時(shí)表示允許從低特權(quán)級的代碼轉(zhuǎn)移到該段執(zhí)行。
- R 指示代碼段是否允許讀出。代碼段總是可以執(zhí)行的,但是為了防止程序破壞,它是不允許寫入的。至于是否有讀出的可能,由R位決定。R=0時(shí)表示不能讀出。R=1時(shí),則代碼段是可以讀出的。
- A 是已訪問位,用于指示它所指向的段最近是否被訪問過。
3、總結(jié)
今天學(xué)習(xí)段描述符的格式,以及段描述符各個(gè)字段的含義。
筆記記得不是很全,如果有不懂的可以加我聯(lián)系方式一起交流。
學(xué)習(xí)探討加個(gè)人:
qq:1126137994
微信:liu1126137994
總結(jié)
以上是生活随笔為你收集整理的【OS学习笔记】十四 保护模式二:段描述符的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。