2012-03-09 204 views
1

我試圖編寫一個函數來保護給定的vm_area_struct中的每個pte。給定地址的ptep的功能是什麼?我有:如何找到給定地址的ptep?

pte_t *ptep; 
for (addr = start; addr < end; addr += PAGE_SIZE) { 
    ptep = WHATS_THIS_FUNCTION_CALLED(addr); 
    ptep_set_wrprotect(mm, addr, ptep); 
} 

什麼是WHATS_THIS_FUNCTION_CALLED叫?

+0

''follow_page()'with'FOLL_GET' flag? – 2012-03-12 17:51:59

回答

1

你的問題的簡短答案是使用__get_locked_pte。不過,我會建議不要這樣做,因爲有更好的(資源爭用方面的高效和公平)方式來實現您的目標。

在linux中,遍歷頁表的典型習慣用法是嵌套for循環四層深(四是linux支持的頁表級別數)。有關示例,請參見copy_page_rangeapply_to_page_rangein mm/memory.c。實際上,如果仔細查看copy_page_range,則會在內核/ fork.c中從dup_mmap分叉時調用它。它基本上在整個vm_area_struct上運行。

您可以複製這些函數中使用的習慣用法。但是有一些警告。例如,copy_page_range通過在copy_pmd_range內使用完全獨立的copy_huge_pmd完全支持透明巨頁(2.6.38)。除非你想要寫兩個單獨的函數(一個用於正常頁,一個用於透明大內存頁,看到Gracefull fallbackDocumentation/vm/transhuge.txt

的一點是,在Linux虛擬內存是非常複雜的,所以一定要完全瞭解每一個可能的用途例如follow_pagemm/memory.c應該演示如何覆蓋你所有的基地

+1

''pagewalk'機制可以作爲起點,看看[ mm/pagewalk.c](http://lxr.linux.no/linux+v3.2.9/mm/pagewalk.c#L189)。 – 2012-03-12 17:49:59

+0

'pagewalk'機制正是我一直在尋找的! – 2012-03-18 14:36:21

相關問題