FreeBSD VM内核内存管理

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 下一页
本文涉及到的源码是FreeBSD5.0Release , 参考4.4BSD设计与实现相关章节 , Matt Dillon的文章 。
VM系统涉及的主要数据结构描述
1. vmspace
该结构用于描述一个进程的虚拟地址空间 , 其包含了平台无关性的vm_map结构和平台相关性的pmap结构 , 以及该进程内存使用的一些统计计量 。
2. vm_map
该结构是描述与平台无关性的虚拟地址空间的最高层数据结构 , 其包含了一系列虚拟地址有效地址映射实体和这些映射的属性 。
3. vm_map_entry
该结构描述了一段虚拟地址空间(start – end) , 以及该段地址空间代表的是一种VM对象、另一个地址映射还是一个地址子映射 , 及其相应的共享保护和继承等属性 。
4. vm_object
【FreeBSD VM内核内存管理】该结构描述了一段虚拟地址空间的数据来源 , 它可以描述一个文件、一段为零的内存和一个设备等等 。
5. vm_page
该结构描述了一页物理内存 , 是VM用于表述物理内存的低层数据结构 。页尺寸是在系统启动时 , 由平台决定的 。
6. pagerops (vm_pager)
该结构描述了VM对象的后台存储如何访问 , 在FreeBSD中 , 是通过pagerops结构描述函数指针 , 实现不同类型的对象的具体操作 , 在vm_object结构中 , 通过handle成员指定具体类型对象对应的数据结构 , 比如设备类型对应dev_t (cdev结构指针) 。在一般OS描述中 , 采用vm_pager描述该目的的数据结构 。
本文集中讨论FreeBSD内核虚拟地址空间的管理 , 涉及到内核地址空间分配和内核地址空间动态分配 。FreeBSD的内核空间总是被映射到每一个进程的地址空间的最高部分 。和任何其它进程一样 , 内核也是通过包含一系列的vm_map_entry结构实体的vm_map结构来管理一段地址空间的使用 。子映射是内核映射特有的 , 用于隔离、限制一段地址空间以提供给内核子系统使用 , 比如mbuf操作 。本文主要讨论与平台无关性的内容 , 涉及到平台相关性时 , 以i386为例简要说明 。
1. SI_SUB_VM初始化
在系统启动时 , mi_startup()函数会调用SI_SUB_VM初始化与平台无关的VM系统 , 其定义是:“SYSINIT(vm_mem, SI_SUB_VM, SI_ORDER_FIRST, vm_mem_init, NULL) 。在vm_mem_init函数初始化之后 , 我们就只使用虚拟内存了 , 现在分析该函数的实现:
vm_set_page_size();
该函数设置页面尺寸 , i386是PAGE_SIZE(4K) , 记录在系统统计vmmeter结构类型的全局变量cnt的v_page_size成员中 。
virtual_avail = vm_page_startup(avail_start, avail_end, virtual_avail);

    推荐阅读