看linux記憶體機制好幾遍了,總算是對記憶體機制有了基本的認識。
下面就說乙個我剛看記憶體是的乙個問題:
使用者態程序的虛擬位址如何轉換成實體地址?
區分乙個程序,我們都知道最簡單就是程序的pid。我們就從(pid,virtualaddress)來看看如何將乙個程序的虛擬位址轉換為實體地址phyaddress。
首先根據pid我們可以得到這個程序的task_struct,進而通過task_struct得到mm,通過mm得到pgd。
好了,現在我們有pgd和virtualaddress.
通過pgd和virtualaddress我們可以得到頁表pte.
有了pte和virtualaddress,我們就可以計算實體地址了
phyaddress=(pte_val(pte)&page_mask)|(virtualladdress&~page_mask)
實體地址既然出來了,訪問這個位址的值就比較簡單了,只需要將實體地址轉換為核心線性位址就行。
*phyaddress=*((char *)phyaddress+page_offset)
有說的不對的地方,請不吝指教。
使用者態程序的虛擬位址如何轉換成實體地址
使用者態程序的虛擬位址如何轉換成實體地址?區分乙個程序,我們都知道最簡單就是程序的pid。我們就從 pid,virtualaddress 來看看如何將乙個程序的虛擬位址轉換為實體地址phyaddress。首先根據pid我們可以得到這個程序的task struct,進而通過task struct得到m...
初試將虛擬位址轉換為實體地址
背景 最近學習張銀奎的 軟體除錯 看到 2.7.5 節 使用windbg觀察分頁機制,終於看到第乙個可以操作的例子,但始終不能按書上的方式正確的將虛擬位址轉換為實體地址,google一下,終於解決,放到這裡記錄一下。注 可以看到提示符是 kd,這裡為了避免開兩個windbg,直接使用的是核心除錯除錯...
程序的虛擬位址空間
linux程序虛擬位址空間是linux記憶體管理的乙個重要部分。總的虛擬位址空間通常按3 1的比例劃分,其中1g分給核心,3g分給使用者。由低位址到高位址分別為 唯讀段 該部分空間 只能讀,不可寫 包括 段 rodata 段 c常量字串和 define定義的常量 資料段 儲存全域性變數 靜態變數 的...