程序的運(yùn)行從boot-->loader-->kernel這整個(gè)過程中代碼都運(yùn)行在特權(quán)級0(最高特權(quán)級),進(jìn)程工作的特權(quán)級1(即低特權(quán)級),當(dāng)然這是出于安全性的考慮,如果不考慮安全性,進(jìn)程
完全可以工作在特權(quán)級0.
1. 第一個(gè)問題,要從高特權(quán)級向低特權(quán)級轉(zhuǎn)變,怎么轉(zhuǎn)變呢?這里用到一個(gè)人工模擬的中斷返回(iretd),這里有個(gè)小疑問根據(jù)我的了解,iret和iretd都可以表示中斷返回,書中是
用的iretd,不知道為什么,當(dāng)然這并不影響我們對全局的了解,嗯,繼續(xù),首先我們要把將要運(yùn)行在特權(quán)級1上的進(jìn)程所需的寄存器準(zhǔn)備好,這個(gè)準(zhǔn)備好怎么理解呢,具體來說,
cs中保存的是將要從ring0跳轉(zhuǎn)到ring1的進(jìn)程A的選擇子,ds,es,fs等原理一樣(應(yīng)該是數(shù)據(jù)段描述符),ip應(yīng)該是進(jìn)程A第一個(gè)條要執(zhí)行的指令,按照順序把它們壓入棧中
2. 完成上一步一些數(shù)據(jù)結(jié)構(gòu)是少不了的比如說書中的進(jìn)程(PROGREE),TSS ,IDT,GDT等
3. 為了以后多進(jìn)程的考慮我們要把每一個(gè)進(jìn)程放到一個(gè)段中,即每個(gè)進(jìn)程一個(gè)LDT,所以需要一個(gè)在全局描述符表中添加一個(gè)局部描述符,當(dāng)然一個(gè)描述符對應(yīng)一個(gè)選擇子。
每個(gè)局部描述符所指的段中都有什么東西呢?想想看,程序運(yùn)行需要代碼段,需要堆棧,需要數(shù)據(jù)段,所以LDT中有兩個(gè)描述符,分別是代碼段描述符和數(shù)據(jù)段(堆棧段)描述符
4. 最后初始化TSS,TSS中只用到了兩項(xiàng),ring0的es和esp,為什么要用到這兩項(xiàng)呢?這是在保存ring0狀態(tài)時(shí)寄存器的值?
5. 最后細(xì)說一下這個(gè)中斷,其實(shí)很好理解,但是我表達(dá)的可能不是太好,當(dāng)從ring1到ring0時(shí),這時(shí)會(huì)讀取TSS的值,TSS中只用到了兩項(xiàng),分別為es和esp,esp記錄的是進(jìn)程
表的位置,進(jìn)程表位于特權(quán)級為0的段中(這個(gè)一定要注意),讀取TSS的值后,esp就指向了進(jìn)程表,這時(shí)把進(jìn)程A的狀態(tài)保存,其實(shí)就是把進(jìn)程A所有的寄存器保存下來,這時(shí)候就
進(jìn)入了ring0,這時(shí)就可以執(zhí)行相應(yīng)的中斷處理,中斷處理的內(nèi)容當(dāng)然可以包括進(jìn)程調(diào)度,如果這個(gè)過程中用到堆棧的話,那么毫無疑問會(huì)破壞進(jìn)程表,為什么呢?因?yàn)楫?dāng)壓棧完成的
時(shí)候esp指向進(jìn)程表的首地址處,所以此時(shí)進(jìn)程堆棧操作的話會(huì)破壞堆棧(但也不是絕對,破壞了在復(fù)原就好了,不過這里是容易讓人疏忽的地方),所以這里要把堆棧指向另一個(gè)位
置,然后在這個(gè)位置隨意使用。 另外要說的一點(diǎn)事處在ring1的進(jìn)程沒有用到TSS
6. 最后說下《自己動(dòng)手寫操作系統(tǒng)》和linux0.12的區(qū)別,0.12是這樣實(shí)現(xiàn)的,0.12用TSS保存進(jìn)程的狀態(tài),0.12進(jìn)程進(jìn)程切換的時(shí)候用到了TSS描述符(其實(shí)0.12進(jìn)程切換直接
或者間接都用到了TSS描述符),中斷的時(shí)候用中斷門和陷阱門(沒有任務(wù)門),由于0.12是用TSS自動(dòng)保存進(jìn)程的狀態(tài)所以中斷/切換的時(shí)候就直接跳轉(zhuǎn)到相應(yīng)的處理函數(shù),這里感
覺0.12設(shè)計(jì)還是要好的,因?yàn)橛玫搅薚SS的功能,畢竟這是硬件實(shí)現(xiàn),速度上要快,而且要省心不少,《自己》中也用到了TSS,不過給人的感覺只是用到了一小部門功能
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
