Linux kernel 学习笔记(1) --分段分页保护机制
使用80x86處理器進(jìn)行尋址時(shí)牽涉到三種不同的地址,其關(guān)系如下所示
?
邏輯地址------------------->線性地址-------------------------->物理地址
???????????????? (分段)???????????????????????????? (分頁)
分段的保護(hù)機(jī)制:
?
一個(gè)邏輯地址由兩部分組成:段標(biāo)識(shí)符和偏移量。其中偏移量是一個(gè)32位長的字段,段標(biāo)識(shí)符是一個(gè)16位長的字段,稱為段選擇符,含有一個(gè)13位的段描述符索引,一個(gè)1位的GDT和LDT指示位和一個(gè)兩位的請(qǐng)求者特權(quán)級(jí)。
請(qǐng)求者特權(quán)級(jí)(RPL)是用來指示當(dāng)前CPU的特權(quán)級(jí)。0代表最高優(yōu)先級(jí),3代表最低優(yōu)先級(jí),Linux只用0和3,分別稱之為內(nèi)核態(tài)和用戶態(tài)。
?
為了快速方便的找到段選擇符,處理器提供了段寄存器,段寄存器的唯一目的是存放段選擇符,其中CS寄存器中包含一個(gè)兩位的字段,用來指明CPU的當(dāng)前優(yōu)先級(jí)(CPL)。
?
段描述符是由8個(gè)字節(jié)來表示段的特性,它被保存在全局描述符表(GDT)和局部描述符表(LDT)中,由于段描述符的內(nèi)容較多,在此不一一介紹。關(guān)鍵的有一個(gè)兩位表示的描述符特權(quán)級(jí)(DPL),主要用于限制對(duì)這個(gè)段的存取,它表示可以訪問這個(gè)段的最小CPU優(yōu)先級(jí)。
?
以上三段共提到3個(gè)特權(quán)級(jí),分別是RPL、CPL和DPL。是不是有點(diǎn)暈了,不著急,下面說明三個(gè)的關(guān)系。
?
DPL:描述符特權(quán)級(jí)(Descriptor Privilege Level)
存儲(chǔ)在描述符中的權(quán)限位,用于描述代碼的所屬的特權(quán)等級(jí),也就是代碼本身真正的特權(quán)級(jí)。一個(gè)程序可以使用多個(gè)段(Data,Code,Stack)也可以只 用一個(gè)code段等。正常的情況下,當(dāng)程序的環(huán)境建立好后,段描述符都不需要改變——當(dāng)然DPL也不需要改變,因此每個(gè)段的DPL值是固定。
CPL:當(dāng)前特權(quán)級(jí)(Current Privilege Level)
是CS?register?里bit?0和bit?1?位組合所得的值.在某一時(shí)刻就只有這個(gè)值唯一的代表程序的CPL。在Linux系統(tǒng)中代表當(dāng)前處于內(nèi)核態(tài)還是用戶態(tài)。
?
RPL:請(qǐng)求特權(quán)級(jí)RPL(Request Privilege Level)
RPL保存在選擇子的最低兩位。 RPL 說明的是進(jìn)程對(duì)段訪問的請(qǐng)求權(quán)限,意思是當(dāng)前進(jìn)程想要的請(qǐng)求權(quán)限。 RPL 的 值 由程序員自己來自由的設(shè)置,并不一定RPL>=CPL,但是當(dāng)RPL<CPL時(shí),實(shí)際起作用的就是CPL了,因?yàn)樵L問時(shí)的特權(quán)檢查是判 斷:EPL=max(RPL,CPL)<=DPL 是否成立,所以RPL可以看成是每次訪問時(shí)的附加限制,RPL=0時(shí)附加限制最小,RPL=3時(shí)附 加限制最大。所以你不要想通過來隨便設(shè)置一個(gè)rpl來訪問一個(gè)比cpl更內(nèi)層的段。
因?yàn)槟悴豢赡艿玫奖茸约焊叩臋?quán)限,你申請(qǐng)的權(quán)限一定要比你實(shí)際權(quán)限低才能通過CPU的審查,才能對(duì)你放行。所以實(shí)際上RPL的作用是程序員可以把自己的程序降級(jí)運(yùn)行——有些時(shí)候?yàn)榱烁玫陌踩?程序可以在適當(dāng)?shù)臅r(shí)機(jī)把自身降低權(quán)限(RPL設(shè)成更大的值)。
?
段機(jī)制中使用特權(quán)級(jí)實(shí)現(xiàn)自己的保護(hù)機(jī)制
?
分頁的保護(hù)機(jī)制:
?
分頁機(jī)制中將32位的線性地址分成3個(gè)域
目錄項(xiàng) (高10位)
頁表項(xiàng)(中10位)
偏移量(低12位)
?
頁目錄項(xiàng)和頁表項(xiàng)具有相同的結(jié)構(gòu)其中與權(quán)限有關(guān)的有:
Read/Write標(biāo)志
讀寫特權(quán),如果為0,表示相應(yīng)頁表或者頁是只讀的,如果為1,則表示可讀寫。
User/Supervisor標(biāo)志
和頁表相關(guān)的特權(quán)級(jí)只用兩個(gè),如果該標(biāo)志為0,處于內(nèi)核態(tài)時(shí)才能尋址,如果標(biāo)志為1,總能對(duì)頁尋址。
總結(jié)
以上是生活随笔為你收集整理的Linux kernel 学习笔记(1) --分段分页保护机制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在麻省理工读计算机专业,看美国的计算机教
- 下一篇: linux设备驱动——andriod平台