使用者態程序的虛擬位址轉換到實體地址

2021-05-23 21:37:15 字數 567 閱讀 8201

看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定義的常量 資料段 儲存全域性變數 靜態變數 的...