6

我试图了解 ARM64 中 Zircon 的(Fuchsia OS 内核)如何分配页面,所以我找到了 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 {

我在谷歌上找不到 PMM 区域,也没有在 Fuchsia 文档上找到。有人可以向我澄清这些概念吗?

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

4

1 回答 1

1

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

此信息由引导加载程序通过 ZBI(Zircon 引导映像)传递给 Zircon 。从那里,您可以看到 arenas如何在mem_arena_init.

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

于 2021-01-18T07:57:03.580 回答