NetBSD 内存管理系统 UVM 浅析
2006-08-09 22:57:02 来源:WEB开发网核心提示: uvm_obj, vm_amap 及一下的结构我们称为底层结构, 内存的实际分配和操作都在这以下的层面完成, 它们最终指向内存分配管理的最小单位 vm_page. 整个 uvm 的核心数据可以表示如下, vm_amap 和 uvm_obj 之间的虚线我们会在下面的章节解释. 并非真正表示指
uvm_obj, vm_amap 及一下的结构我们称为底层结构, 内存的实际分配和操作都在这以下的层面完成, 它们最终指向内存分配管理的最小单位 vm_page.
整个 uvm 的核心数据可以表示如下, vm_amap 和 uvm_obj 之间的虚线我们会在下面的章节解释. 并非真正表示指针引用关系.
vmspace
|
v
uvm_map_entry <--> vm_map_entry ...
| |
| v
| vm_pmap
|
+-----------------+
| |
v |
vm_aref |
| |
v v
vm_amap < - - - > uvm_obj
| |
v v
vm_anon ... vm_page <-> vm_page ...
|
v
vm_page
另外, 我们注意到 uvm.h 中有个 uvm 结构, 这是各种 uvm 资源和参数的集合, 系统中只存在一个 uvm 对象.
顶层映射机构 (vmspace, uvm_map, uvm_map_entry)
顶层映射机构所要负责的事务包括
- 将一个对象映射进地址空间.
- 对一个虚地址 (VA), 定位到所属 uvm_map_entry (因为在此之下的地址是连 续的, 不用什么定位).
- 提取地址空间的某一断以供其他地址空间使用.
- COW (Copy-On-Write) 的顶层处理.
其主要代码在 uvm_map.c, 这个一个有 4000 多行代码的大文件, 我们从顶层接口到底层实现逐一分析.
uvm_map_lookup_entry()
该函数能得到一个 VA 所指向, 或正好在此之前的一个 uvm_map_entry. 该函数不但用于地址映射, 还帮助地址空间分配机构找到合适的地址范围.
更多精彩
赞助商链接