Linux 内核建立虚拟物理地址映射的src代码点在哪里?
Where is the src code point where Linux kernel establish mapping virtual-physical address?
据我所知,当程序试图访问对应的 PTE NO present 的虚拟地址时,内核将触发页面错误,页面错误处理程序将处理它。
在处理程序中,如果错误是由于没有物理映射到PTE引起的,内核应该分配空闲物理页并将物理地址写入PTE。
我找到了很多像__handle_mm_fault
或handle_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
据我所知,当程序试图访问对应的 PTE NO present 的虚拟地址时,内核将触发页面错误,页面错误处理程序将处理它。
在处理程序中,如果错误是由于没有物理映射到PTE引起的,内核应该分配空闲物理页并将物理地址写入PTE。
我找到了很多像__handle_mm_fault
或handle_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