1. 程式人生 > >關於gdtr和cr3地址型別的理解

關於gdtr和cr3地址型別的理解

結論:1.cr3裡儲存頁目錄表的基址的地址型別為實體地址,頁目錄表裡的每一項也是頁表的實體地址。

2.gdtr裡儲存的地址型別為線性地址。

原因:由於段表並不能保證頁表存在或開啟,所以它的機制,完全建立在無頁表存在的情況。體現在gdtr上,就是gdtr的地址和gdt裡的描述符裡的地址型別一樣,都為線性地址,當開啟分頁機制後有可能會和實體地址不同。而且,當想要更換段頁式的時候,必須在現有地址轉換情況下,構造段表和頁表,但是當往gdtr裡填段表基址是,卻必須是在無段錶轉換的地址。頁表和頁目錄表的基址是無段表和頁錶轉換後的地址,也就是實體地址。

換句話說,就是換段表時,不依賴現有段表。換頁表時,不依賴段表和頁表。

比如下面這張圖,好像是intel手冊上的,但是根據我的實踐,不知道是不是我的理解不對,我認為不僅cr3是實體地址,頁目錄表項和頁表項都應該是實體地址。


題外話:最近,想實現一個簡單的基於x86的作業系統記憶體管理功能,網上關於段頁式記憶體管理介紹也挺多,但是,由於自己對計算機硬體不是很瞭解,所以,在演算法之餘,更多問題是硬體的細節問題。感覺如果硬體細節不清楚,總會遇到很多奇怪的問題,而且,很難排除,花了很多時間,心裡也沒底。所以也建議大家無論做什麼,基礎永遠值得花更多時間。