NetBSD 内存管理系统 UVM 浅析
2006-08-09 22:57:02 来源:WEB开发网核心提示: uvm_fault() 作为内存管理的核心uvm_fault() 是一个 1200 多行的大函数, 它在读或写的 fault 的时候, 实际完成了内存分配, COW 等核心功能. 我们可以这么看, 前面介绍的函数只是设置好了数据结构, 而真正的功能是由 uvm_fault() 完成的. 我
uvm_fault() 作为内存管理的核心
uvm_fault() 是一个 1200 多行的大函数, 它在读或写的 fault 的时候, 实际完成了内存分配, COW 等核心功能. 我们可以这么看, 前面介绍的函数只是设置好了数据结构, 而真正的功能是由 uvm_fault() 完成的. 我们现在来分析这个函数, 也作为前面章节介绍内容的综合分析.
注意 uvm_fault.c 头部的注释, 解释了产生 fault 的几种情况, 这也能加深对前面章节 COW 机制的理解.
uvm_fault() 的主体脉络如下:
begin
loop up for fault page;
check protection -> cow_now;
handle need_copy case, copy amap if we need;
check case0(no amp, no uobj, errr);
A: statbish intrest range, pre-fault, get fault level;
if shadowed (uper level fault)
uvm_anonget();
B: handle loan case (break if we need);
C: handle COW case;
pmap_enter();
update page queue;
else
ask the backing obj to handle it;
D: handle it in a general way if backing obj
do not know how to do;
get uobjpage, ensure it's not PG_RELEASED;
if not promote (case 2A)
fault it directlly
else (case 2B)
get a anon and fill it with data;
add it into amap;
pmap_enter();
update page queue;
A: line 698
一个 fault 的页面周围的页面也很可能在近期 fault, 为了防止过多的内存访问异常拖慢速度, 我们有根据 advise 的设置的范围进行 pre-fault.
更多精彩
赞助商链接