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

1.为什么要有虚拟内存
在早期的计算机中,是没有虚拟内存的概念的 。我们要运行一个程序,会把程序全部装入内存,然后运行 。
当运行多个程序时,经常会出现以下问题:
1)进程地址空间不隔离,没有权限保护 。
由于程序都是直接访问物理内存,所以一个进程可以修改其他进程的内存数据,
甚至修改内核地址空间中的数据 。
2)内存使用效率低
当内存空间不足时,要将其他程序暂时拷贝到硬盘,然后将新的程序装入内存运行 。
由于大量的数据装入装出,内存使用效率会十分低下 。
3)程序运行的地址不确定
因为内存地址是随机分配的,所以程序运行的地址也是不确定的 。
2.虚拟地址和物理地址
对于32位系统,寻址指针为4字节,对应的虚拟地址空间为0-2^32,即0-4G 。
对于64位系统,寻址指针为8字节,对应的虚拟地址空间为0-2^64,即0-16G 。
要注意的是,这个地址空间是虚拟的,并非实际存在的 。
linux内核把虚拟地址空间分为两部分:用户进程空间,内核进程空间 。
如下如所示:

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

文章插图
【什么是虚拟地址?虚拟地址的工作原理是什么?】 
更多linux内核视频教程文本资料免费获取后台私信【内核】 。
什么是虚拟地址?虚拟地址的工作原理是什么?

文章插图
 
 
 
在缓存原理中,换入/换出的数据以块为最小单位 。在内存管理时,也是地址空间的最小单位 。
虚拟地址空间划分为多个固定大小的虚拟页(VP),物理地址空间(DRAM内存)划分为多个固定大小的物理页(PP),
虚拟页和物理页的大小是一样的,通常为4KB 。
虚拟页和物理页存在着以下关系:
虚拟页和磁盘文件映射,然后缓存到物理页 。
根据是否映射,是否缓存,可以将虚拟页的状态分为以下三种:
1)未映射的页
即虚拟页没有映射到磁盘文件
2)未缓存的页
虚拟页映射到了磁盘文件,但是没有缓存到物理页,也就是内存上 。
3)缓存的页
虚拟页映射到了磁盘文件,并且缓存到物理页
如下图所示:
什么是虚拟地址?虚拟地址的工作原理是什么?

文章插图
 
3.虚拟地址的工作原理
对于进程来说,使用的都是虚拟地址 。每个进程维护一个单独的页表 。何为页表?
页表是一种数组结构,存放着各虚拟页的状态,是否映射,是否缓存 。
1)数组的索引号,表示虚拟页号
2)数组的值
若为null,表示未映射的页
若非null,第一位表示有效位,为1,表明缓存的页;为0,表明未缓存的页面 。
其余位表示缓存到的物理页号 。
页表结构图如下:
什么是虚拟地址?虚拟地址的工作原理是什么?

文章插图
 
进程执行时,当需要访问虚拟地址中存放的值时,步骤如下:
1)CPU会先找到虚拟地址所在的虚拟页(VP3),根据页表,找出页表中第3条的值 。
判断有效位,为1,DRMA缓存命中,获根据物理页号,找到物理页中的内容,返回 。
2)若有效位为0,产生缺页异常,调用内核缺页异常处理程序 。
它会选择一个物理页(如PP4),作为牺牲页,将该页的内容刷新到磁盘文件 。然后,把VP3映射的磁盘文件,缓存到该物理页 。
页表中的第3条,有效位变1,同时,物理页号表号变为PP4 。
3)缺页异常处理完毕后,返回中断前的指令,重新执行,此时缓存命中,执行1)
4)将找到的内容映射到高速缓存,CPU从高速缓存中获取该值,结束 。
4.使用虚拟地址需要注意的问题
1)磁盘和主存传送页的活动叫做页面调度 。页面调度会引起磁盘流量,如果程序的局部性不好,会频繁进行页面调度,叫做“缓存颠簸” 。
操作系统会在内存中分配一块交换区作为缓冲区,来加速页面的调度 。
2)一级页表占用的空间是比较大的,根据按需调度的原则,一般使用的是多级页表,即一级页表指向二级页表,这样大大压缩了页表的大小 。
5.地址翻译
地址翻译指的是DRAM缓存命中时,由虚拟地址找到物理地址的过程 。
该过程是完全由硬件来完成的 。
1)CPU有一个专门的页表基地址寄存器(PTBR)指向当前页表的基地址,快速定位到该进程的页表 。
2)根据虚拟页号,找到虚拟地址在页表的值 。


推荐阅读