什么是虚拟地址?虚拟地址的工作原理是什么?( 二 )


3)根据值中的物理页号,找到物理地址 。
6.Linux中的虚拟内存机制
Linux把虚拟内存划分成区域area的集合,一个area包括连续的多个页 。
area的数据结构如下所示:
1)内核为每个进程维护了一个单独的任务结果task_struct
2)task_struct的mm指针,指向了mm_struct,该结构描述虚拟内存的运行状态 。
3)mm_struct的pgd指针指向进程的一级页表的基地址 。
mmap指针,指向vm_area_struct链表 。
4)vm_area_struct描述area的结构,vm_start表示area的开始位置,vm_end表示area的结束位置,vm_prot表示area内的页的读写权限,vm_flags表示area内的页面是进程私有还是共享,vm_next指向下一个area节点 。

什么是虚拟地址?虚拟地址的工作原理是什么?

文章插图
 
在Linux中,当发生缺页异常时,步骤如下:
1)缺页异常程序,检查虚拟地址在哪个area内 。
2)访问的虚拟页若没有读写权限,则触发一个保护异常,终止进程 。
3)选择牺牲页,刷新到磁盘,从磁盘加载缺失的内容到物理页,更新页表 。
7.Linux虚拟内存需要注意的问题
内存映射机制:初始化虚拟内存区域时,会把虚拟内存和磁盘文件对象对应起来 。
由于内存映射机制,一个磁盘文件对象可被多个进程共享访问,也可被多个进程私有访问 。
当共享访问时,一个进程对该对象的修改会显示到其他进程 。
当私有访问时,修改时会产生保护故障,内核会拷贝这个私有对象,修改的是这个新对象,其他进程指向的是原来的对象 。
fork函数是说明内存映射机制很好的例子:
fork函数会创建带有独立虚拟地址空间的新进程,内核会把当前进程的虚拟内存中数据结构复制一份给新进程 。虚拟内存area包括共享区域和私有区域,新建的进程对私有区域做修改时,会触发写时拷贝,为新进程维护私有的虚拟地址空间 。
8.虚拟地址作用总结
1)虚拟内存管理可以控制物理内存的访问权限
访问的虚拟页若没有读写权限,则触发一个保护异常,终止进程 。
2)虚拟内存让每个进程有独立的地址空间
对于私有区域来说,当不同进程对该区域做修改时,会触发写时拷贝,为新进程维护私有的虚拟地址空间 。
3)VA到PA的映射会给分配和释放内存带来方便 。
物理内存不连续的地址,可映射到连续的虚拟内存地址 。
4)内存效率高
使用了页面调度,不会造成大量的数据装入装出 。




推荐阅读