LINUX虚拟存储系统
linux虚拟存储器区域
- linux为每个进程维持了一个单独的虚拟地址空间,这个虚拟地址空间包括代码,数据,堆,共享库以及栈段。这部分虚拟地址存储器位于用户栈之上。
- 内核将虚拟存储器组织成一些区域(也较段)的集合,一个区域就是已经分配的虚拟存储器的连续片。例如:代码段,数据段,共享库段以及用户栈都是不同的区域。
- 内核为每个进程维护一个单独的任务结果(task_struct).任务结构中的元素包含或者指向内核运行该进程所需要的所有信息(例如:pid,指向用户栈的指针,可执行目标文件的名字以及程序计数器)
- task_struct中的mm_struct他描述了虚拟存储器的当前状态,在mm_struct中我们主要关心pgd和mmap,pgd指向第一级页表的基址。mmap则指向vm_area_struct(区域结构)的链表,其中每一个vm_area_structs都描述了一个当前虚拟地址空间的区域.
1.vm_start:指向这个区域的起始地址
2.vm_end:指向这个区域的结束处
3.vm_port:指向这个区域包含的所有页的读写许可权限
4.vm_flags:描述这个区域页面是与其他进程共享的还是私有的
4.vm_next:指向链表下一个区域结构
共享对象
- linux通过将一个虚拟存储器区域与一个磁盘上的对象关联起来,已初始化这个虚拟存储区域的内容,这个过程叫做存储器映射.虚拟存储区域映射
- 一个对象可以被映射到虚拟存储器的一个区域,要么作为共享对象,要么作为私有对象.如果一个进程将一个共享对象映射到它的虚拟地址空间的一个区域内,那么进程对
这个区域的任何写操作,对于也把这个共享对象的映射到他们的虚拟存储器的其他进程而言也是可见的.而这些变化也会反映到磁盘的原始对象上
- 如果一个进程将一个私有对象映射到它的虚拟地址空间的一个区域内,那么当另一个进程对
这个区域进行修改时就会产生写时拷贝