2011-10-31 76 views
1

出於某種原因,我需要將代碼段的虛擬地址轉換爲物理地址。我做了以下實驗:Linux中進程代碼段的頁面轉換。爲什麼頁表條目爲某些頁面取0?

  1. 我從START_CODE和END_CODE在A處理的mm_struct,這是最初的地址和可執行代碼的最終地址得到虛擬地址。

  2. 我得到的過程A.

  3. 的CR3我通過網頁翻譯的虛擬地址到物理地址的頁面。例如,過程A中有10個代碼段。我將翻譯頁面每個開始處的10個虛擬地址。

  4. 我發現一些頁面會得到Page Table Entry(PTE)== 0.某些頁面可以成功轉換爲物理地址。

  5. 我嘗試Firefox和Minicom作爲我的過程,他們兩人都會陷入困境。

我想我的問題是:有誰可以向我解釋爲什麼PTE == 0?這是否意味着這些頁面已被換出到磁盤?如果是這種情況,我怎麼才能找到這些網頁?

感謝您的任何輸入!

+0

這是在內核模式(如從常規設備驅動程序)或用戶模式? – wallyk

+0

謝謝你的提問。實際上,這既不在內核模式下,也不在用戶模式下。我正在另一臺計算機上進行取證。假設我有一個內存轉儲4G文件,進程A的CR3,進程A的start_code和end_code(虛擬地址)。我需要找出進程A的可執行代碼。 –

回答

2

看起來好像您正嘗試執行頁表內省而不使用內核API。請注意,地址空間安排在vm_area_struct結構的紅黑樹中,您應該使用遍歷它們的API。映射可能隨時發生變化,因此使用這些數據結構的正確鎖定是必要的。

例如,請參閱get_user_pages()函數。它可以用於交換並暫時將頁面固定到內存中。通常會要求使用此功能進行頁表內省,因爲一旦掌握了物理地址,內核就可以隨時換出頁面。

+0

感謝您的迴應。我正在嘗試在沒有內核API的情況下進行分頁轉換。正如我在上面的評論中所描述的,我試圖從內存轉儲中找出進程可執行代碼。但問題是爲什麼PTE == 0的一些頁面的進程可執行代碼。 –

+1

當內核將可執行文件映射到進程的地址空間時,某些頁面不會被加載。實際上,除非可執行文件調用mlock(),否則只有實際運行的代碼會導致頁面錯誤,這會將文件的頁面加載到RAM中。零的PTE對應的代碼部分沒有運行,因此沒有「故障」。 –

+0

這對執行時間特別有用。一些編譯會導致非常大的可執行文件(想想C++中大量的模板提升)。對於內核加載整個可執行代碼的延遲和內存資源都是浪費的。 –

相關問題