NetBSD 内存管理系统 UVM 浅析
2006-08-09 22:57:02 来源:WEB开发网观察 uvm 结构中与页面分配相关的表项, 我们可以知道其基本原理: page_free 指向若干个 (1 - 2 个, i386 的取值是 2) 个 hash pool, 用于管理空闲的页面, page_active 和 page_inactive 双向列表管理在用的 page.
细看 pgfreelist, 它包含若干的 bucket 用于hash, 而每个 bucket 里有两条链表而不是通常的一条. 一条用于存放未知状态页面, 一条用于组织些空白的页面, 这样能显著加快 zero fill page 的分配速度, 而我们知道, 这样的 zero fill page 在系统中大量存在 (程序的 BSS 段), 因此这是个很大的优化.
我们接着分析最常用的接口 uvm_pagealloc() 和 uvm_pagefree(), uvm_pagealloc() 是 uvm_pagealloc_strat() 的包装宏, 我们直接分析 uvm_pagealloc_strat().
uvm_pagealloc_strat()
函数确定本次分配所用的 bucket 号 (所谓 color). 调用 UVM_KICK_PDAEMON, 该宏在内存紧张的时候唤醒 pagedeamon (真形象) 试图增加空闲内存. 然后确定使用真正的分配函数 uvm_pagealloc_pgfl() 的行为, 然后调用 uvm_pagealloc_pgfl() 获取页面.
uvm_pagealloc_pgfl() 相当简单, 根据当前 color (bucket 号) 试图分配, 不行的话找下一个 bucket, 找到后更新一下审计数据. 完毕.
如果 uvm_pagealloc_strat() 顺利获得页面, 就填写下一次分配时使用的 color, 就将参数提供的信息填入之, 之后反向处理 anon 或 obj 的情况, obj 需要将页面链接进 obj 的页面链表, 最后处理空白页面情况即可完成.
uvm_pagefree()
该函数操作更为简单, (XXX: 先忽略掉 loan 的情况先). 需要注意的是 1412 行, 这里是真正用到 hash 函数的地方, 这是一个根据页面的物理地址做的 hash.
更多精彩
赞助商链接