为了将虚拟地址转换为物理地址,处理器首先必须得到虚拟地址页面框号及页内偏移 。一般将页面大小设为2的次幂 。将图3.1中的页面大小设为0x2000字节(十进制为8192)并且在进程Y的虚拟地址空间中某个地址为0x2194,则处理器将其转换为虚拟页面框号1及页内偏移0x194 。
处理器使用虚拟页面框号为索引来访问处理器页表,检索页表入口 。如果在此位置的页表入口有效,则处理器将从此入口中得到物理页面框号 。如果此入口无效,则意味着处理器存取的是虚拟内存中一个不存在的区域 。在这种情况下,处理器是不能进行地址转换的,它必须将控制传递给操作系统来完成这个工作 。
某个进程试图访问处理器无法进行有效地址转换的虚拟地址时,处理器如何将控制传递到操作系统依赖于具体的处理器 。通常的做法是:处理器引发一个页面失效错而陷入操作系统核心,这样操作系统将得到有关无效虚拟地址的信息以及发生页面错误的原因 。
再以图3.1为例,进程Y的虚拟页面框号1被映射到系统物理页面框号4,则再物理内存中的起始位置为 0x8000(4 * 0x2000) 。加上0x194字节偏移则得到最终的物理地址0x8194 。
通过将虚拟地址映射到物理地址,虚拟内存可以以任何顺序映射到系统物理页面 。例如,在图3.1中,进程X的虚拟页面框号0被映射到物理页面框号1而虚拟页面框号7被映射到物理页面框号0,虽然后者的虚拟页面框号要高于前者 。这样虚拟内存技术带来了有趣的结果:虚拟内存中的页面无须在物理内存保持特定顺序 。
3.1.1 请求换页
在物理内存比虚拟内存小得多的系统中,操作系统必须提高物理内存的使用效率 。节省物理内存的一种方法是仅加载那些正在被执行程序使用的虚拟页面 。比如说,某个数据库程序可能要对某个数据库进行查询操作,此时并不是数据库的所有内容都要加载到内存中去,而只加载那些要用的部分 。如果此数据库查询是一个搜索查询而无须对数据库进行添加记录操作,则加载添加记录的代码是毫无意义的 。这种仅将要访问的虚拟页面载入的技术叫请求换页 。
当进程试图访问当前不在内存中的虚拟地址时,处理器在页表中无法找到所引用地址的入口 。在图3.1中,对于虚拟页面框号2,进程X的页表中没有入口,这样当进程X试图访问虚拟页面框号2内容时,处理器不能将此地址转换成物理地址 。这时处理器通知操作系统有页面错误发生 。
如果发生页面错的虚拟地址是无效的,则表明进程在试图访问一个不存在的虚拟地址 。这可能是应用程序出错而引起的,例如它试图对内存进行一个随机的写操作 。此时操作系统将终止此应用的运行以保护系统中其他进程不受此出错进程的影响 。
如果出错虚拟地址是有效的,但是它指向的页面当前不在内存中,则操作系统必须将此页面从磁盘映象中读入到内存中来 。由于访盘时间较长,进程必须等待一段时间直到页面被取出来 。如果系统中还存在其他进程,操作系统就会在读取页面过程中的等待过程中选择其中之一来运行 。读取回来的页面将被放在一个空闲的物理页面框中,同时此进程的页表中将添加对应此虚拟页面框号的入口 。最后进程将从发生页面错误的地方重新开始运行 。此时整个虚拟内存访问过程告一段落,处理器又可以继续进行虚拟地址到物理地址转换,而进程也得以继续运行 。
Linux使用请求换页将可执行映象加载到进程的虚拟内存中 。当命令执行时,可执行的命令文件被打开,同时其内容被映射到进程的虚拟内存 。这些操作是通过修改描叙进程内存映象的数据结构来完成的,此过程称为内存映射 。然而只有映象的起始部分被调入物理内存,其余部分仍然留在磁盘上 。当映象执行时,它会产生页面错误,这样Linux将决定将磁盘上哪些部分调入内存继续执行 。
推荐阅读
- 以Linux做路由器的问题
- Linux 核心--1.前言
- 红豆糖水的功效与作用 红豆糖水的功效与作用禁忌
- Linux 核心--3.软件基础
- 认识Linux操作系统下三大便利开源防火墙
- 如何在Linux中设置磁盘限额?
- Linux下的各种备份方法汇总
- Linux 内核解读入门
- linux使用经验点滴
- 安装 Linux 无盘工作站
