2.内存映射原理
由于所有用户进程总的虚拟地址空间比可用的物理内存大得多,因此只有最常用的部分才与物理页帧关联。我们考察一下通过文本编辑器操作文件的情况。通常用户只关注文件结尾处,因此尽管整个文件都映射到内存中,实际上只使用了几页来存储文件末尾的数据。至于文件开始处的数据,内核只需要在地址空间保存相关信息,如数据在磁盘上的位置,以及需要数据时如何读取。
text段的情形类似,始终需要的只是其中一部分。继续考虑文本编辑器的例子,那么就只需要加载与主要编辑功能相关的代码。其他部分,如帮助系统或所有程序通用的Web和电子邮件客户端程序,只会在用户明确要求时才加载。
内核必须提供数据结构,以建立虚拟地址空间的区域和相关数据所在位置之间的关联。例如,在映射文本文件时,映射的虚似内存区必须关联到文件系统在硬盘上存储文件内容的区域。如图4-4所示。
![](https://img2022.cnblogs.com/blog/2355803/202203/2355803-20220324175204548-1359018931.png)
当然,给出的图示是简化的,因为文件数据在硬盘上的存储通常并不是连续的,而是分布到若干小的区域。内核利用address_space数据结构,提供一组方法从后备存储器读取数据。例如,从文件系统读取。因此address_space形成了一个辅助层,将映射的数据表示为连续的线性区域,提供给内存管理子系统。(address_space:糟糕的是,表示虚拟地址空间的数据结构,以及用于表示数据映射方式的地址空间对应的结构,名称相同。)
按需分配和填充页称之为按需调页法(demand paging)。它基于处理器和内核之间的交互,使用的各种数据结构如图4-5所示。
![](https://img2022.cnblogs.com/blog/2355803/202203/2355803-20220324175835769-1403367217.png)
进程试图访问用户地址空间中的一个内存地址,但使用页表无法确定物理地址(物理内存中
没有关联页)。
处理器接下来触发一个缺页异常,发送到内核。
内核会检查负责缺页区域的进程地址空间数据结构,找到适当的后备存储器,或者确认该访
问实际上是不正确的。
分配物理内存页,并从后备存储器读取所需数据填充。
借助于页表将物理内存页并入到用户进程的地址空间,应用程序恢复执行。