從我的理解Linux不會將所有父進程內存複製到子進程的單獨頁面,它會進行寫入時複製。直到任一進程修改(寫入)映射(共享)頁面中的一些存儲器位置,我們將子和父虛擬地址空間映射到相同的物理存儲器位置(相同的物理頁面)。linux:獲取父和子之間共享的頁面
我想知道是否有一個工具可用,它顯示了進程共享的物理內存頁面#。或者提供虛擬地址的任何工具 - >物理地址映射。這樣我才能真正查看物理地址並檢查進程是否映射到同一物理內存。
謝謝。
從我的理解Linux不會將所有父進程內存複製到子進程的單獨頁面,它會進行寫入時複製。直到任一進程修改(寫入)映射(共享)頁面中的一些存儲器位置,我們將子和父虛擬地址空間映射到相同的物理存儲器位置(相同的物理頁面)。linux:獲取父和子之間共享的頁面
我想知道是否有一個工具可用,它顯示了進程共享的物理內存頁面#。或者提供虛擬地址的任何工具 - >物理地址映射。這樣我才能真正查看物理地址並檢查進程是否映射到同一物理內存。
謝謝。
我不知道是否有專門的工具可用,但所需的所有信息都應該已經通過/proc
文件系統導出。
您的問題中給出的特殊使用案例甚至在相關文檔中明確提及。 (無論是linux-src-directory/Documentation/vm/pagemap.txt
或在線https://www.kernel.org/doc/Documentation/vm/pagemap.txt):
使用頁映射到了解的過程 內存使用的一般過程是這樣的:
- 讀/ proc /進程/地圖,以確定哪些內存空間的部分是 映射到什麼。
- 選擇您感興趣的地圖 - 所有這些,或特定 庫,或在堆棧或堆等
- 開放的/ proc/PID /頁映射和求於你想的網頁檢查。
- 從頁面地圖的每個頁面讀取u64。
- 打開/ proc/kpagecount和/或/ proc/kpageflags。對於每個只讀 的PFN,請在文件中尋找該條目,然後讀取所需的數據。
例如,要找到「唯一的一組大小」(USS),這是一個進程正在使用不與任何其他 進程共享內存量 ,你可以通過每地圖中該過程中,找到PFN, 查看那些在kpagecount中的數據,並計算出僅僅引用一次的 的頁數。
這聽起來像一個XY問題。你能解釋一下爲什麼你想知道一個頁面是否映射到子進程? – 2013-03-10 22:04:07
您需要從外觀上查看內核中存儲的分頁表。 – Tuxdude 2013-03-10 22:11:04