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

时间:2016-01-11 13:05:18

标签: linux memory-management linux-kernel page-tables

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

在处理程序中,如果故障是由没有物理映射到PTE引起的,内核应该为PTE分配空闲的物理页面和写入物理地址。

我找到了许多函数,如__handle_mm_faulthandle_pte_fault,但我找不到内核实际分配物理页面的位置。谁能提出一些建议?

感谢。

2 个答案:

答案 0 :(得分:0)

页面分配的主要功能位于mm/page_alloc.c

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

Linux内核使用 zoned buddy allocator

  • 有几种类型的内存区域(内核/用户内存,DMA,NUMA相关标准等)
  • 页面按特定顺序分配(即订单 n 是2 ^ n页)
  • 一开始,可以使用高阶可用内存块。
  • 如果请求订单的大块不可用,请尝试拆分较大的块或使用几个较低订单的块来满足请求。
  • 如果释放了一个块,分配器会尝试将其与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