最近研究內核,但是一直有幾個問題不太明白,請教一下內核專家,希望能幫我解決:
1、內核直接映射低于896MB的物理記憶體,我理解映射了那么頁表項應該設定了,至少頁表項的Field欄位(20位,即頁框物理地址最高20位)已經指向了相應物理記憶體?
2、內核直接映射了前896MB的物理記憶體,映射了不一定代表頁框已經分配給內核了?即映射了但是可能頁表項的Present欄位(為1表示所指的頁在主存中)還是為0?因為如果這里內核映射了前896MB就代表頁框已經分配的話,那么當主機所有物理記憶體少于896MB的時候,用戶行程就沒有頁框可以分配了?
3、如果我第2點是正確的話,那么內核訪問映射了但沒分配頁框的頁,這時應該會產生缺頁例外吧?應該就是發現Present為0,所以產生缺頁例外吧?
uj5u.com熱心網友回復:
求大牛解答!!!!uj5u.com熱心網友回復:
1. 內核直接映射了前896M物理記憶體,用3G+X的虛擬地址就能訪問X的物理地址,這是內核初始化記憶體管理器時建立的映射,這里的頁表中的p位都是1,這套頁表只確保線性一致映射,保證任何時刻內核都能直接訪問物理記憶體(先不管高端記憶體)。2. 這些記憶體被記憶體管理器再分配,比如建立用戶行程虛擬地址空間的映射,這時其實一個物理頁可以通過多個虛擬地址訪問。(是內核管理著記憶體,它把記憶體分給行程,不存在別人分配記憶體給它這個說法)
3. 最后建議了解下舊版本內核記憶體管理器的建立程序,bootmem和buddy分配器代碼可參考2.4.0的內核,配合內核情景分析那本書。
uj5u.com熱心網友回復:
Linux中的地址有很多種型別,總線地址,邏輯地址,虛擬地址等等,映射關系相當復雜。在我記憶中,少于896兆的情況下,內核是會給所有記憶體建立表單,并且內核虛擬地址和物理地址一一對應,這個虛擬地址在整個作業系統中是唯一的,不論在哪個行程想訪問這些虛擬地址都是最終訪問到相同的物理地址,并且訪問的唯一途徑是進入內核態。
而你在用戶空間malloc出來的虛擬地址跟內核態的就完全不是一回事,用戶空間的虛擬地址,只有當你需要用到的時候才會生成,并且這個虛擬地址也是向內核空間申請到的,也就是說用戶態并沒有其本身的記憶體池,一切記憶體都是通過類似于malloc的函式,進行brk之類系統呼叫進入內核態申請,并更新行程的虛擬地址表。內核拿出池子里的一塊空閑記憶體交給行程使用,并且賦予其一個用戶態虛擬地址,也就是說此時此處物理記憶體至少擁有一個內核虛擬地址以及一個用戶態虛擬地址。這一部分可以參照mmap的用法,mmap就是利用了這個原理實作了內核同用戶態之間的快捷資料互動。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/123554.html
標籤:內核源代碼研究區
下一篇:sensor驅動問題
