什么是内核中 MMU 上下文中的 PMM arena (zircon/fuchsia)

What is a PMM arena in the context of MMU in a kernel (zircon/fuchsia)

我试图了解 Zircon(紫红色 OS 内核)如何在 ARM64 中分配页面,所以我找到了 mmu.cpp https://fuchsia.googlesource.com/fuchsia/+/4277d3203daa0fc5e4dd1625cf96891dd9882f44/zircon/kernel/arch/arm64/mmu.cc#328

但它确实如此:

  if (likely(!test_page_alloc_func_)) {
    status = pmm_alloc_page(0, &page, paddrp);
  }

其中 pmm_alloc_page 来自这里:https://fuchsia.googlesource.com/fuchsia/+/4277d3203daa0fc5e4dd1625cf96891dd9882f44/zircon/kernel/vm/pmm.cc#61

这里定义的 pmm 节点:https://fuchsia.googlesource.com/fuchsia/+/4277d3203daa0fc5e4dd1625cf96891dd9882f44/zircon/kernel/vm/pmm_node.h 说:

// per numa node collection of pmm arenas and worker threads
class PmmNode {

我在 Fuchsia 文档中都找不到 google PMM 区域。有人可以向我澄清这些概念吗?

我想了解 MMU 在 Zircon 内核上的 ARM64 中是如何处理的

PMM Arenas 描述了连续物理内存的区域。您需要以某种方式知道您可以使用哪些物理页面,因为某些范围可能会为 BIOS 内存保留。

此信息由引导加载程序传递给 mem_arena_init 中的 Zircon via the ZBI (Zircon Boot Image). From there, you can see how the arenas are initialized

PMM 仅用于处理物理内存。有一个可用的物理页面的空闲列表,您可以将它与 pmm_alloc 和 pmm_free 函数一起使用。还有一个 API 来获取连续范围的物理内存,与特定边界对齐(对驱动程序有用)。