1

As I know, when program try to access virtual address that the corresponding PTE is NO present , kernel will trigger page fault and page fault handler will handle it.

In handler, if fault is caused by no physical mapping to the PTE, kernel should allocate free physical page and write physical address to PTE.

I found many functions like __handle_mm_fault or handle_pte_fault, but I cannot find the location where kernel actually allocate physical page. Could anyone give some suggestion?

Thanks.

4

2 回答 2

0

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

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

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

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

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

于 2016-01-11T14:38:14.920 回答
0

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

于 2016-01-11T15:20:21.180 回答