进程通过缺页中断得到物理内存:
1. 请求调页场景
层层调用关系如下:
handle_pte_fault()-->do_anonymous_page()-->alloc_zeroed_user_highpage_movable(...)-->__alloc_zeroed_user_highpage(__GFP_MOVABLE, ...)-->
alloc_page_vma(GFP_HIGHUSER | movableflags,vma, vaddr)-->
#define alloc_page_vma(gfp_mask, vma, addr) \
alloc_pages_vma(gfp_mask, 0, vma, addr, numa_node_id(), false)
#define alloc_pages_vma(gfp_mask, order, vma, addr, node, false)\
alloc_pages(gfp_mask, order)
以上层层调用关系, 结合下面的宏, 得到最终通过alloc_pages(GFP_HIGHUSER |__GFP_MOVABLE, 0)分配物理页框.
2. 写时复制场景
调用关系如下:
handle_pte_fault()-->do_wp_page()-->wp_page_copy()-->alloc_zeroed_user_highpage_movable()
-->alloc_page_vma(GFP_HIGHUSER_MOVABLE, vma, address);
同样得知, 最终通过alloc_pages(GFP_HIGHUSER |__GFP_MOVABLE, 0)分配物理页框.
以上alloc_pages()函数的第一个参数都是GFP_HIGHUSER |__GFP_MOVABLE, 第二个参数都是0. 意味着每次分配一个页, 如果是32位系统并有超过896MB的内存, 会首先分配高端内存.
参考代码linux-4.2
阅读(2572) | 评论(0) | 转发(0) |