這一章涉及intel8086系列cpu的保護模式程式設計,應該是學習核心程式設計,驅動程式設計及嵌入式程式設計一些基礎知識。不過對於沒接觸過底層程式設計的我來說,感覺還是好複雜
。不過裡面也有許多以前彙編學過的東西,大部分還是能看懂的
。我覺得圖表就能說明大部分內容了,細節東西,不能都做筆記,所以大部分筆記都是圖表- -。
1,首先是關於8086cpu的各個標誌暫存器,其內容如下:
2,記憶體管理的暫存器,主要用於實現分段記憶體管理機制,gdtr是全域性段描述符表暫存器,idtr是中斷向量表暫存器,tr是任務暫存器,ldtr是區域性描述符表暫存器。
3,控制暫存器,cr0~cr3,很重要的暫存器,控制cpu操作模式及當前任務的特性等等。具體各個暫存器的用法內容太多,還是看書吧 = =.
cr0:含有控制處理器操作模式和狀態的系統控制標誌。
cr1:保留不用。。。
cr2:含有導致頁錯誤的線性位址,用於分頁機制。
cr3:含有頁目錄表物理記憶體位址,也被稱為頁目錄基位址暫存器pdbr。
用於操作以上暫存器的指令列表:
4,記憶體定址方面,8086彙編都有講過了。這裡主要是分段管理機制與分頁管理機制。
分段機制中,每個段的大小不是固定的,因此使用段時必需通過查詢段描述符表來獲得段的資訊。而分頁機制中頁的大小剛是固定的,每個頁大小為4kb,。
分頁儲存是實現虛擬記憶體的關鍵,沒有使用分頁的話,要將整個段在主存與磁碟的虛擬記憶體之間移動,在效率及實現上都是不可接受的,通過分頁,每次移4kb的資料是較好的方式。
由於線性位址為4gb,可分為1024*1024個頁面,每個記錄頁表資訊的頁表項大小為4b,總共需要4mb的記憶體空間,這在早期物理記憶體只有可憐的幾mb的計算機上是不允許的。所以又採用了二級頁表的方式,通過乙個4kb的頁目錄錶可定址到1024個頁表,每個頁表4kb存放1024個頁表項。這樣做並沒有減少使用的記憶體總量,反而還多了4kb,之所以這樣做是因為可以將二級頁表整個移動到虛擬記憶體空間中,同一時間內只有幾個活動的頁表,可以節省大量的空間(對那個時候來說,0.12版只能支援最大16mb的主存 = =)。
沒有使用分頁機制的話,計算出來的線性位址將直接作為物理記憶體的位址。
分段跟分頁都可以有保護機制,分頁的保護比分段更底層,分段保證對段的訪問有正確的許可權及範圍,而分頁由圖可以看出在分段保護通過後還會再進行分頁機制的保護,保護內容主要是讀寫及訪問許可權。保護有任務之間的保護,保證任務不會訪問到其他任務的記憶體空間,還有特權級的保護,控制系統任務與使用者任務之間的訪問關係。
5,分段的細節:
內容太多了,還是弄弄圖就好了。
段與段之間並不一定是完全分開的,有可能交叉甚至重疊。
訪問段,通過選擇符定位找到段描述符表中的乙個描述符,再通過段描述符訪問具體的段。乙個描述符表只有2^13=8192個描述符,所以選擇符前三個位不用於定位,前兩位用於表示特權級,第三位用於表示要訪問的段是在全域性描述符表中還是區域性描述符表中。
區域性描述符表也作為乙個段,其段描述符儲存在全域性描述符表中
Window核心學習之保護模式基礎
段暫存器有6個分別是 cs,ss,ds,es,fs,gs。這些段暫存器包含16位的可見部分和80位的隱藏部分,共90位。16位的可見部分就是我們知道的cs等段暫存器的值,我們可以在od中檢視。這16位可見部分也稱為是段選擇子,其16位的結構的最低兩位是rpl即此段訪問的請求許可權級別,再往前一位是t...
Linux核心學習
交叉工具鏈 核心相關知識 linux系統的構成 使用者空間 核心空間 思考 為什麼劃分為兩個層次?目的其實是為保護作業系統,防止應用程式的異常導致作業系統崩潰。核心空間與使用者空間是程式執行的兩種不同狀態,通過系統呼叫和硬體中斷能夠完成從使用者空間到核心空間的轉移。那麼linux的核心由哪些構成呢?...
linux 核心學習
linux核心獲取 官網 linux作業系統的核心是模組化,可以使用lsmod命令檢視核心模組,下面展示已載入系統的模組 root 172.16.0.55 vendor composer test lsmod module size used by nfnetlink queue 8111 0 nf...