在Linux中交换页面

时间:2017-02-27 08:39:55

标签: linux-kernel virtual-memory swapfile

我发现mm / memory.c中的函数 do_swap_page 用于交换Linux内核中的IN页面。但是,此函数的输入参数包含一个pte_t *和一个pte_t。使用这两个参数有什么区别?任何帮助,将不胜感激。

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 个答案:

答案 0 :(得分:2)

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)

来自handle_pte_fault函数called

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是指向pte条目的指针,它将使用新的pte进行修改(实际代码将类似于*page_table = pte ):

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