我将从以下几个方面进行介绍
1.什么是虚拟地址空间?
2.进程与虚拟地址空间的关系
3.为什么要有虚拟地址空间?
什么是虚拟地址空间?
虚拟地址空间的定义:
虚拟地址空间其实就是操作系统对每一个进程都认为自己独自占有占有内存的一种假象,用来存放虚拟地址。
虚拟地址空间的实现:
通过对链表,红黑树的相关操作实现虚拟地址内空间这样的一个形式。
虚拟地址空间的图示如上;在代码层面上虚拟地址空间其实就是一个mm_struct这样的一个结构体,结构体里面就用无符号整型对代码区,数据区,堆区,栈区的起始地址和结束地址进行了存储从而划分出来各个区域;
介绍一下页表:页表就类似于数的k/v结构,可以通过k值来访问v值。
有了对虚拟地址空间的基本了解,接下来就谈谈进程与虚拟地址空间的关系
操作系统用task_struct结构体对该文件的属性进行管理,mm_struct就是task_struct内的成员,当一个文件加载入到内存中时,就会创建task_struct结构体,将磁盘上文件的属性填充到该结构体里面,代码部分和数据这部分在加载到内存当中时会通过页表建立对应关系,将虚拟地址就填充到了mm_struct当中了。此时CPU就会从可执行程序的表头里获取enter(里面存放着该可执行程序的起始地址),当cpu读取到指令后就会到虚拟地址空间找到对应的虚拟地址,如果页表里有对应的映射,就通过页表映射就可以找到内存的物理地址,从而读取指令;如果页表里没有就会执行缺页中断,将这部分的代码和数据加载到内存当中,通过页表建立映射关系,反复如此进程就运行起来。
注:缺页中断是为了解决大型程序在内存一次性加载不下以及一次性加载时间过长的问题。
虚拟地址空间有什么优势?
在早期的计算机是采用直接访问的方式进行的,这样访问会存在以下问题:
1.当多个进程访问同一个数据时就会访问冲突了
2.没有进行访问检测,当一个程序指针越界访问时就可能访问到其他进程的数据,从而对其他进程产生影响,这是我们所不想看到
3.直接访问的不当操作还可能导致系统的效率降低
有了虚拟地址空间的话,我们就是通过虚拟地址映射物理地址这样的话就可以有以下优势:
1.当出现野指针的时候,可以在虚拟地址映射物理地址时检测出来,提高了操作系统的安全性
2.每个进程都有独立地虚拟地址空间,使得各个进程之间互不干扰,,相互独立
3.有了虚拟地址空间的话,系统就可以将进程加载到任意位置,不用关心内存的具体细节