Linux 内核建立虚拟物理地址映射的src代码点在哪里?

Where is the src code point where Linux kernel establish mapping virtual-physical address?

据我所知,当程序试图访问对应的 PTE NO present 的虚拟地址时,内核将触发页面错误,页面错误处理程序将处理它。

在处理程序中,如果错误是由于没有物理映射到PTE引起的,内核应该分配空闲物理页并将物理地址写入PTE。

我找到了很多像__handle_mm_faulthandle_pte_fault这样的函数,但是我找不到内核实际分配物理页面的位置。任何人都可以提出一些建议吗?

谢谢。

页面分配的主要函数位于mm/page_alloc.c

主要功能是__alloc_pages()(在当前内核中实际上是调用__alloc_pages_nodemask()的宏)

linux 内核使用 分区伙伴分配器:

  • 几种类型的内存(kernel/user 内存、DMA、NUMA-related 标准等)有多个区域
  • 页面按特定顺序分配(即顺序 n 是 2^n 页)
  • 开始时,可​​用内存的高阶块可用。
  • 如果请求顺序的一个chunk不可用,尝试拆分一个更大的chunk或者使用几个低顺序的chunk来满足请求。
  • 如果一个块被释放,分配器会尝试将它与其 buddies(即在分配时从中拆分的块)合并,以从中补充一个 higher-order 块。

freelist是存放空闲页面的内存结构。它根据体系结构进行初始化(即 arch/x86/mm/init_*.c 中的 intel/amd)

在内核3.18中,流程是这样的:handle_mm_fault->handle_pte_falut->do_anonymous_page->alloc_zeroed_user_highpage_movable