2013-03-10 60 views
0

從我的理解Linux不會將所有父進程內存複製到子進程的單獨頁面,它會進行寫入時複製。直到任一進程修改(寫入)映射(共享)頁面中的一些存儲器位置,我們將子和父虛擬地址空間映射到相同的物理存儲器位置(相同的物理頁面)。linux:獲取父和子之間共享的頁面

我想知道是否有一個工具可用,它顯示了進程共享的物理內存頁面#。或者提供虛擬地址的任何工具 - >物理地址映射。這樣我才能真正查看物理地址並檢查進程是否映射到同一物理內存。

謝謝。

+0

這聽起來像一個XY問題。你能解釋一下爲什麼你想知道一個頁面是否映射到子進程? – 2013-03-10 22:04:07

+0

您需要從外觀上查看內核中存儲的分頁表。 – Tuxdude 2013-03-10 22:11:04

回答

0

我不知道是否有專門的工具可用,但所需的所有信息都應該已經通過/proc文件系統導出。

您的問題中給出的特殊使用案例甚至在相關文檔中明確提及。 (無論是linux-src-directory/Documentation/vm/pagemap.txt或在線https://www.kernel.org/doc/Documentation/vm/pagemap.txt):

使用頁映射到了解的過程 內存使用的一般過程是這樣的:

  1. 讀/ proc /進程/地圖,以確定哪些內存空間的部分是 映射到什麼。
  2. 選擇您感興趣的地圖 - 所有這些,或特定 庫,或在堆棧或堆等
  3. 開放的/ proc/PID /頁映射和求於你想的網頁檢查。
  4. 從頁面地圖的每個頁面讀取u64。
  5. 打開/ proc/kpagecount和/或/ proc/kpageflags。對於每個只讀 的PFN,請在文件中尋找該條目,然後讀取所需的數據。

例如,要找到「唯一的一組大小」(USS),這是一個進程正在使用不與任何其他 進程共享內存量 ,你可以通過每地圖中該過程中,找到PFN, 查看那些在kpagecount中的數據,並計算出僅僅引用一次的 的頁數。