2017-02-27 95 views
0

我已經確定使用mm/memory.c中的函數do_swap_page來交換Linux內核中的IN頁面。但是,該函數的輸入參數包含一個pte_t *和一個pte_t。使用這兩個參數有什麼區別?任何幫助,將不勝感激。在Linux中交換頁面

static int do_swap_page(struct mm_struct *mm, struct vm_area_struct *vma, 
unsigned long address, pte_t *page_table, pmd_t *pmd, 
unsigned int flags, pte_t orig_pte) 
+1

最新[do_swap_page](http://lxr.free-electrons.com/source/mm/memory.c#L2534)接受單指針到'struct vm_fault'。該結構的每個字段都用[struct的定義](http://lxr.free-electrons.com/source/include/linux/mm.h#L294)本身來描述。可能,你會發現它對你的目的有用。 – Tsyvarev

+0

感謝您的回覆@Tsyvarev。你的答案是有幫助的,但我仍然不需要傳遞這兩個參數或它們之間的差異。 –

回答

1

4.4 do_swap_page仍然有很多參數:http://lxr.free-electrons.com/source/mm/memory.c?v=4.4#L2439

2446 static int do_swap_page(struct mm_struct *mm, struct vm_area_struct *vma, 
2447     unsigned long address, pte_t *page_table, pmd_t *pmd, 
2448     unsigned int flags, pte_t orig_pte) 

,這是calledhandle_pte_fault功能http://lxr.free-electrons.com/source/mm/memory.c?v=4.4#L3257

3272 static int handle_pte_fault(struct mm_struct *mm, 
3273      struct vm_area_struct *vma, unsigned long address, 
3274      pte_t *pte, pmd_t *pmd, unsigned int flags) 
3275 { 
3276   pte_t entry; 
3287   entry = *pte; 
3289   if (!pte_present(entry)) { 
3298     return do_swap_page(mm, vma, address, 
3299           pte, pmd, flags, entry); 

所以,第二pte_t orig_pte只是原來PTE的副本, pte_t *page_table是指向將是mod的pte條目的指針指明分數與新PTE(實際的代碼將是這樣*page_table = pte):

2560   pte = mk_pte(page, vma->vm_page_prot); 
2570   set_pte_at(mm, address, page_table, pte);