据我所知,当程序尝试访问虚拟地址时,相应的PTE NO 存在,内核将触发页面错误,页面错误处理程序将处理它。
在处理程序中,如果故障是由没有物理映射到PTE引起的,内核应该为PTE分配空闲的物理页面和写入物理地址。
我找到了许多函数,如__handle_mm_fault
或handle_pte_fault
,但我找不到内核实际分配物理页面的位置。谁能提出一些建议?
感谢。
答案 0 :(得分:0)
页面分配的主要功能位于mm/page_alloc.c
主要功能是__alloc_pages()
(实际上是当前内核中的一个宏调用__alloc_pages_nodemask()
。)
Linux内核使用 zoned buddy allocator :
buddies
(即块在分配时拆分的块)合并,以从中补充更高阶的块。空闲列表是存储空闲页面的内存结构。它根据体系结构进行初始化(即arch/x86/mm/init_*.c
中的intel / amd)
答案 1 :(得分:0)
在内核3.18中,过程如下:handle_mm_fault
- > handle_pte_falut
- > do_anonymous_page
- > alloc_zeroed_user_highpage_movable