《自已動手寫作業系統》學習扎記之保護模式

2021-06-03 03:06:56 字數 2722 閱讀 2620

《自已動手寫作業系統》學習扎記之保護模式(x86)

學完這一章後,我嘗試來好好總結一下,發現在很難做到,因為相關的細節牽扯比較多,一不小心就必須要到具體的實現細節,而要了解這些細節intel 開發手冊已有清晰的描述.下面以問題的方式要來記錄一下自已的一些體會.

1. 為什麼需要保護模式?

這跟作業系統歷史的發展密切相關,在早期,作業系統是單程序,你輸入乙個命令就執行乙個命令,像dos.完了等待使用者續繼輸入.這挺浪費計算機資源,人們希望同時執行多個任務,即同時執行多個程序.多程序會引起一系列的問題,這裡說一下乙個基本的問題,怎麼樣保證乙個程序不非法訪問其它程序的記憶體.學過8086cpu的人知道,這種cpu是相當陽春白雪,通過段:偏移的方式就可以訪問物理記憶體,如果我們在這種cpu上實現多程序,(我們假設速度足夠快,記憶體足夠大),作業系統能合理分配記憶體,但無法在軟體層面保證乙個程序非法訪問其它的記憶體,也就是說需要硬體的支援.因此要穩定可靠的實現多程序,必須對原有的硬體體系進行改造增強, 現在我們給這個增強的硬體體系叫做保護模式.

2.保護模式增加有那些基本的硬體設施?

這裡以ia-32為例,

a. 4個控制暫存器(32位) 

cr0 cpu工作方式工作方式控制,包含實模式/保護模式,啟用與禁用分頁機制等.

cr1  保留

cr2和cr3用於分頁管理管理機制

b. 系統位址暫存器

gdtr(48位)全域性描述符表暫存器,  包含全域性描述符表段的基位址和段界限.

ldtr(16位)  區域性描述符暫存器  ldtr實際是乙個特別的選擇子,用來定位每個任務的區域性描述符表

idtr(48位)  中斷描述符暫存器 包括idt的基位址32位和段界限16位

tr (16位)  任務狀態段暫存器 包含當前任務的任務狀態段的選擇子

3.保護模式的一些基本術語的解釋?

a.描述符

描述符是乙個資料結構,用來說明一段記憶體的情況,包括段的基位址,段界限,段屬性(段型別,段許可權等), 或 用來說明一種呼叫門,包括目標**段的選擇子,入口位址偏移和其它屬性。

b.描述符表

實際是乙個描述符陣列,分為全域性描述符表,區域性描述符表,中斷描述表

全域性描述符表  表示系統最頂層的記憶體分配描述符表集合,通常包含核心所使用**段,資料段,堆疊段,以及一些特別的段.

區域性描述符表  每個任務私有的段描述表

中斷描述符表  表示中斷和異常處理的各種門的描述符表

c.呼叫門

正如字面的意思,作用相當於乙個"門",其實就是乙個目標**段的入口.包括目標**的選擇子和偏移位址和許可權級別等其它屬性.通常應用程式需要呼叫作業系統提供的服務,而應用程式執行在較低的特權級別,無法直接訪問作業系統的服務,這就要通過呼叫門實現系統呼叫,這其中涉及到許可權的檢查,堆疊的切換等.

d.選擇子

選擇子有點類似於乙個index,所不同的是還包含乙個位指示是全域性描述表還是區域性描述表,還有2個位元組表示rpl(request privilege level),在保護模式下是載入到段暫存器cs,ss,ds,es,fs,gs.選擇子加描述符的設計個人感覺是又增加了乙個層次,用描述符來專門記錄記憶體的定址資訊,不再像8086那樣定址受暫存器位的影響,如果以後調整記憶體的定址方式,基本上不會對其它硬體造成影響.

e.中斷和異常

中斷和異常是硬體級實現的事件通知機制。中斷概念跟實模式是一樣的,只是實現的方式發生了變化。異常是cpu檢測到指令的執行先決條件不滿足(如除法指令不能除以0)或某些系統規則被違返或不滿足(缺頁等)發出的事件通知,cpu不是god,異外情況發生了只能向外發出通知請求處理。異常分為faults,traps和aborts. faults為可稱之為「良性」的異常,意為可以correct並重新恢復程式執行。traps 是一種特別的異常,用於設定斷點或除錯。aborts是真的發生了錯誤,會中斷程式的執行。中斷和異常雖然概念不一樣,但具體的實現的方式是一樣的。

f.分段和分頁

想像一下一本書,如果你把這本書每一頁都撕下來排成一列,從第一頁到最後一頁整體就叫'段',每一頁就叫'頁',分段就是先確定一塊'大'塊的記憶體,確定的它的基位址和界限,然後再切分成更小的塊相等的記憶體,這就是分頁.切分頁的方法通過二級目錄,這裡以4k每頁為例,首先把線性位址的高10位作為index在一級目錄中得到二級目錄的首位址,再把線性位址的中間10位作為index在二級目錄中得到實體地址高20位,最後和線性位址的低12位相加得到真正的實體地址。

另外,分頁的另乙個好處可以實現虛擬記憶體.

4.保護模式是如何工作的?

一旦把cr0的pe位(0)設為1,cpu就進入了保護模式.保護模式最大的改變首先是記憶體定址。段暫存器退化成了乙個選擇子,eip,esp還是偏移位址,

定址變成了首選通過選擇子,在全域性或區域性描述符表中找到相應的描述符,描述符中有段的基位址,基位址加偏移位址得到線性位址,如果沒有開啟分頁,

線性位址就是實體地址.如果開啟了分頁,就發生上面描述的情形。另外保護模式在這其中會進行大量的安全檢查,下面描述。

5.保護模式的有那些"保護"?

段級保護

訪問是否超出段的範圍,段型別是否正確,如你不能把資料段載入到**段,段的許可權級別檢查等。

頁級保護

包括許可權和讀寫保護

iopl(i/o permssion level)

提供i/o保護,如果當前的程式沒有相應的許可權,不能執行一些i/o敏感的指令,如in,out,cli,sti.

i/o許可位圖

控制當前的程式那些i/o埠可以訪問。

保護模式的細節比較旁雜,要詳細了解可以參看intel開發手冊三卷,要真的理解保護模式工作原理還得review書上的源**,最好自已動手除錯一番。

《自已動手寫作業系統》學習扎記之保護模式 x86

學完這一章後,我嘗試來好好總結一下,發現在很難做到,因為相關的細節牽扯比較多,一不小心就必須要到具體的實現細節,而要了解這些細節intel 開發手冊已有清晰的描述 下面以問題的方式要來記錄一下自已的一些體會 1.為什麼需要保護模式?這跟作業系統歷史的發展密切相關,在早期,作業系統是單程序,你輸入乙個...

自己動手寫作業系統 筆記之安裝DOS

安裝dos作者沒有交代 自己搜尋了下資料 整個工作分為以下四步 1,安裝virtual pc 2,新建一台pc 3,在此pc上安裝dos 4,在dos下實現檔案共享 1,安裝virtual pc 請大家盡量購買正版,因為現在這個軟體的老闆是大名鼎鼎的m 你乙個不小心就會被他將你告上法庭,然後要求你賠...

作業系統學習筆記之啟動

pc機的記憶體布局 以前接觸過微控制器,arm9和8086cpu,深感把握乙個處理器,有兩點很重要,記憶體的布局和中斷向量 中斷向量表在 所以先看看80386的記憶體布局。留個印象 提供機器需要的各種電壓。加電cpu復位,cpu會到cs ip cs 16 ip 0xffff0處去取指,會放個跳轉指令...