一步步编写操作系统 57 门、调用门与RPL序 2
接上文:
提供了4種門的原因是,它們都有各自的應(yīng)用環(huán)境,但它們都是用來實(shí)現(xiàn)從低特權(quán)級的代碼段轉(zhuǎn)向高特權(quán)級的代碼段,咱們這里也只討論有關(guān)特權(quán)級的功用:
call和jmp指令后接調(diào)用門選擇子為參數(shù),以調(diào)用函數(shù)例程的形式實(shí)現(xiàn)從低特權(quán)向高特權(quán)轉(zhuǎn)移,可用來實(shí)現(xiàn)系統(tǒng)調(diào)用。call指令使用調(diào)用門可以實(shí)現(xiàn)向高特權(quán)代碼轉(zhuǎn)移,jmp指令使用調(diào)用門只能實(shí)現(xiàn)向平級代碼轉(zhuǎn)移。
以int指令主動發(fā)中斷的形式實(shí)現(xiàn)從低特權(quán)向高特權(quán)轉(zhuǎn)移,linux系統(tǒng)調(diào)用便用此中斷門實(shí)現(xiàn),以后咱們在實(shí)現(xiàn)中斷時會展開細(xì)說。
以int3指令主動發(fā)中斷的形式實(shí)現(xiàn)從低特權(quán)向高特權(quán)轉(zhuǎn)移,這一般是編譯器在調(diào)試時用,本書中咱們不用過多關(guān)注。
任務(wù)以任務(wù)狀態(tài)段TSS為單位,用來實(shí)現(xiàn)任務(wù)切換,它可以借助中斷或指令發(fā)起。當(dāng)中斷發(fā)生時,如果對應(yīng)的中斷向量號是任務(wù)門,則會發(fā)起任務(wù)切換。也可以像調(diào)用門那樣,用call或jmp指令后接任務(wù)門的選擇子或任務(wù)TSS的選擇子。
坦白說,現(xiàn)代操作系統(tǒng)很少用到調(diào)用門和任務(wù)門,在咱們的系統(tǒng)中也只用到了中斷門,而陷阱門是供調(diào)試器用的,咱們并未打算支持應(yīng)用程序的調(diào)試,一方面工作量較大,另一方面違背咱們的初衷,就是想通過更少的代碼了解操作系統(tǒng)原理。
不知道大伙兒有沒有想過,為什么可以使用門結(jié)構(gòu)進(jìn)入高特權(quán)級呢?這肯定是cpu硬件電路中寫好的規(guī)則,具體我也不清楚也不需要搞清楚,但我是這樣理解的,舉個例子,用門提升特權(quán)級,就像站在高處的臺子上往蹦床上跳一樣,人會被蹦床彈得比臺子還高。關(guān)鍵點(diǎn):臺子的高度位于蹦床和目標(biāo)高度之間,至少得和蹦床一樣高,這樣人才能被彈得更高。其效果如圖
實(shí)際上,門也是按照這個蹦床原理實(shí)現(xiàn)的,我們把“門”分成門檻和門框來比喻:
門的“門檻”是訪問者特權(quán)級的下限,訪問者的特權(quán)級再低也不能比門描述符的特權(quán)級DPL低,否則訪問者連門都進(jìn)不去,更談不上使用調(diào)用門。即門描述符的DPL特權(quán)級要低于或等于當(dāng)前特權(quán)級CPL,即數(shù)值上CPL <= 門的DPL,此處可見,門描述符相當(dāng)于數(shù)據(jù)段描述符一樣,只允許比自己特權(quán)級高或相同特權(quán)級的程序訪問。
門的“門框”是訪問者特權(quán)級的上限,訪問者的特權(quán)級再高也不能比門描述符中目標(biāo)程序所在代碼段的DPL高,否則本身的特權(quán)級就比目標(biāo)代碼特權(quán)級還高的話,還使用門干嗎,而且真要是這樣的話,這意味是特權(quán)級由高向低轉(zhuǎn)移了,這絕對是被禁止的。也就是說,門中包含的目標(biāo)程序所在的段的特權(quán)級DPL要高于或等于當(dāng)前特權(quán)級CPL,即數(shù)值上CPL >= 目標(biāo)代碼段DPL,進(jìn)門之后,處理器將以目標(biāo)代碼段DPL為當(dāng)前特權(quán)級CPL,因此進(jìn)門之后,就能“一步登天”啦。
總結(jié)
以上是生活随笔為你收集整理的一步步编写操作系统 57 门、调用门与RPL序 2的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一步步编写操作系统 47 48 二进制程
- 下一篇: 计算机系统的物质实体,计算机基础-(-第