简述Zircon pmm机制。

在Zircon中,同样支持NUMA。NUMA里的每个 物理内存结点(Memory Node), Zircon用 PmmNode 类来表示。每一个 物理内存结点 的内部可能有许多 内存洞(Hole),即物理内存不是连续的。这样一个 物理内存结点 就被 内存洞 隔成了众多相互不重叠的的 物理内存区域(Memory Arena) ,每个这样的 物理内存区域, Zircon用 PmmArena 类来表示。 同属于一个 PmmNode 的所有 PmmArena 被全部加到这个PmmNode里的一条双向链表 arena_list_ 中。PmmNode 还包含 5 条 页面队列: free_list_, inactive_list_, active_list_, modiefied_list_, wired_list_。

 

Zircon的物理内存管理器 pmm,提供 如下这些操作:

 

allocate 操作:

1. allocate 多个物理内存页框

2. allocate 一个物理内存页框

3. allocate 一片连续多个内存页框的物理内存

4. allocate 一片指定内存地址的物理内存(可能数量超过一个物理内存页框)

 

free 操作

1. free 一个物理内存页框

2. free 一片含多块页框的物理内存

 

查询操作

1. 查询还有多少未分配的 物理内存页框 (单位是:页框)

2. 查询还有多少未分配的 物理内存(单位是:字节)

 

转换操作

1. 物理地址 paddr 转成 vm_page 结构指针

 

当前版本的Zircon,还只使用一个 物理内存结点,PmmNode 的实例就只有一个。被定义成一个全局变量:

 

static PmmNode pmm_node;

 

这个 pmm_node 中的 Memory Arena 双向链表 arena_list_, 在PC启动时,从boot loader 提供的内存有效地址区间 (address range)列表 初始化而来,address range 互不重叠,每个都 初始化成一个 PmmArena,再添加到 pmm_node 的双向链表 arena_list_ 中。在ARM中,由于有些内存会被保留起来,这些保留内存(Reserved Memory)就相似于 内存洞 。在启动 ARM时候, 从内核Image中的 kernel.memory-limit 之类的 section 中 找出所有被保留的内存,这样就能知道有哪些被隔开的未保留的物理内存区域,这些区域内存的物理内存是连续的,每一个都被和PC中的情形一样,被实例化成一个PmmArena,再往PmmNode中添加。

当然,每个PmmArena在初始化时,还会将自己内存的物理页框 加到 PmmNode 的页面队列 free_list_ 中。这也是PmmNode的free_list_的元素得来之法。

 

 

你可能感兴趣的:(fuchsia-zircon)