2012-04-22 112 views
2

基本上,我需要使用頁面來識別進程或任務,並相應地做出關於是否允許頁面被換出的一些決定。由於內核AFAIK中的交換模塊主要處理結構頁面,所以我想知道是否存在我缺少的某些現有技巧。從在include/linux/mm_types.h(V> = 2.6),這樣的評論:如何從struct頁面訪問struct vm_area_struct頁面

  • 系統中的每個物理頁已經與
  • 相關的結構頁面,隨時記錄無論它是我們使用頁面爲
  • 時刻。請注意,我們無法跟蹤哪些任務正在使用
  • 頁面,但如果它是頁面緩存頁面,則rmap結構可以告訴我們
  • 誰在映射它。

表明,我們可以通過一些物理到虛擬反向映射做到這一點,但我不能從RMAP功能弄清楚(毫米/ rmap.c)如何實現我所期待的。

在此先感謝您的幫助,非常感謝。

回答

1

要回答你的實際問題「如何從結構頁面結構vm_area_struct」,至少有兩個答案。

對於匿名頁面,您可以使用page_anon_vma(),它返回一個anon_vma - 它存儲在page->mapping設置爲表明這不是一個特殊的標誌一個struct address_space(以節省空間)。

anon_vma您可以步行anon_vma_chain,每個入口點指向vma。從vma您可以獲得mm,然後一個任務。

查看page_referenced_anon()舉例。

對於你看page->mapping文件頁面這是一個struct address_space,並從那裏你走在i_mmap這是一個struct prio_tree_root。見page_referenced_file()

我不確定這實際上是否會幫助你實現你的想法,但你去了。

0

像這樣的東西可能是你想要的。

這是原型:

// [ http://lxr.free-electrons.com/source/include/linux/rmap.h#L27 ] 
149 struct anon_vma *page_get_anon_vma(struct page *page); 

這是如何使用它: // [http://lxr.free-electrons.com/source/mm/ksm.c#L1898] // [...]

 anon_vma = page_get_anon_vma(page); 
1902 anon_vma_lock_read(anon_vma); 
1903 anon_vma_interval_tree_foreach(vmac, &anon_vma->rb_root, 
1904            0, ULONG_MAX) { 
1906       vma = vmac->vma; 
1907       if (page_address < vma->vm_start || 
1908        page_address >= vma->vm_end) 
1909         continue; 
[...] } 
     anon_vma_unlock_read(anon_vma); 
+0

這是一個很好的文章vma's:https://lwn.net/Articles/383162/ – 2016-04-02 04:21:11