動手製作作業系統 認識實模式與保護模式

2021-07-11 17:48:55 字數 1854 閱讀 3777

因為計算機啟動後按照實模式定址,cpu只能訪問1m的記憶體,所以為了訪問1m記憶體後更大的空間,就需要進入到保護模式,保護模式不僅有更大的位址空間,還將程式分成了4個特權級(0~4),數字越小特權級越高,在涉及特權級的操作時,處理器將會對特權級進行比較,最終允許訪問或者拒絕訪問。

描述符:乙個特殊的資料結構,包含段基址,段界限,屬性,共8位元組。

全域性描述符表(gdt):由描述符組成的陣列,在系統中只能有乙個。

區域性描述符表(ldt):由區域性描述符組成的陣列,在系統中可以有若干個。

cpl:當前執行程式的特權級。

rpl:描述符選擇子的特權級。

dpl:段的特權級。

一致**段:被拿出來共享的**段,可以被低特權級使用者直接訪問,和非一致**段共同是描述符中的乙個屬性。

非一致**段:限制低特權級訪問而被作業系統保護起來的**段。

下面具體看一下保護模式下cpu是如何定址的:

假設,描述符表中只有乙個段基址為0(描述符中段基址位數為32位,由高到低位於描述符的第8,5,4,3位元組),段界限為4gb(段界限位數為20位,由高到低位於描述符的第7位元組前四位,1,0位元組,但由於屬性中有一位可以將段界限粒度變成4k,所以段界限最大可以達到4gb)的描述符,暫存器gdtr中儲存描述符表的首位址,只在分段模式下,所有cpl,rpl,dpl都為0。

首先要選擇從哪個段的基址訪問,這裡只有乙個段,那麼就選擇描述符表中的第乙個描述符,將第乙個描述符的位址相對描述符表頭的偏移量裝入段暫存器,

然後第5m+1個位元組 在相對基址0,偏移量為0x00500000處。

那麼就將eip設定為0x00500000。

這就是保護模式的定址方式。

然後看一看程式特權級是如何檢查的:

訪問資料段:

當程式訪問資料段,tss,要確保cpl和rpl<=資料段描述符的dpl。

直接轉移:

1、當程式轉移至非一致**段時,若cpl與目標**段描述符的dpl相等,且使用的選擇子rpl小於等於dpl,則允許訪問,cpl不變。

2、當程式轉移至一致**段時,若cpl大於等於目標**段描述符的dpl,則允許訪問,cpl不變。

通過門描述符的轉移:

1、當程式通過呼叫門轉移至一致**段時,若cpl小於等於呼叫門描述符的dpl,且目標**段描述符的dpl小於等於cpl,則允許訪問,cpl不變。

2、當程式通過呼叫門轉移至非一致**段時,分成兩種情況,一種是通過call轉移,一種是jmp:

call:同一致**段;

jmp:若cpl小於等於呼叫門描述符的dpl,且目標**段描述符的dpl等於cpl,則允許訪問。

轉移後cpl等於目標**段描述符dpl。

總結如下:

保護模式:暫存器gdtr中儲存描述符表(gdt)的界限和第乙個表項的位址,暫存器cs中為描述符表的索引,描述符中記錄著表示對應段的段基址(物理記憶體段的起始位址)和段界限(此段最多能容納的位元組數),而eip中為相對於這個描述符中的段基址的偏移,位址空間為4gb。

程式通過dpl,cpl,rpl3種特權級來控制程式是否可以轉移,以及資料是否可以被使用,僅在保護模式中有效。

動手製作作業系統 一點分析問題的經驗

書中講解ldt部分的例子和 很簡單,本以為抄完執行一下馬上就能結束這章。但是很尷尬,在抄完書中的 後,編譯執行,實際執行的結果和書中的結果並不一樣,程式只執行了一半就導致系統崩潰了,乾瞪眼看 看了半天,和書中的 明明寫的一樣,那麼為什麼會出現這個問題呢?書中程式執行在freedos上,大致意思如下 ...

作業系統 認識認識保護模式(三)中斷

理解中斷與異常的機制 除錯8259a的程式設計基本例程 除錯時鐘中斷例程 建立idt,實現乙個自定義的中斷,功能可自定義,如特定鍵盤組合觸發某個動作 電子鐘 自己遊走的字元顯示 蜂鳴器等 了解iopl的作用 理解中斷與異常的機制 除錯8259a的程式設計基本例程 除錯時鐘中斷例程 建立idt,實現乙...

《自己動手寫作業系統》讀書筆記 初識保護模式

書本第三章第一節是 認識保護模式 初步 講解了保護模式下全域性描述符表gdt 段描述符 段選擇子 從實模式進入保護模式等內容。去年看這個的時候,如果不是有以前學習保護模式時做的筆記,還真 不好懂呢,因為作者提供的材料不夠系統,對僅學習過8086組合語言的人來說,是不太好理解的。下面的內容大體以我以前...