页错误 Page Fault/缺页异常 详解
1. 第一部分:如果你看得懂
1.1 页错误定义
- 当cpu执行进程的某个页面时,发现他要访问的页(虚拟地址的页)没有在物理内存中,而导致的中断(页错误)。
(一个可执行文件可能很大,放在磁盘上,由局部性原理一次只将其中一部分读进内存) - 百度定义:
指的是当软件试图访问已映射在虚拟地址空间中,但是目前并未被加载在物理内存中的一个分页时,由中央处理器的内存管理单元所发出的中断。
1.2 页错误的处理
-
页错误发生后,操作系统去查询保存可执行文件和其进程虚拟空间映射关系的数据结构
-
找到空页面所在的VMA虚拟内存区域。然后通过它VMA计算出空页面在可执行文件中偏移
-
然后再物理内存中分配一个物理页面,并将该物理页和虚拟空间中虚拟页建立映射关系。
-
最后将cpu控制权返还给进程,从刚才页错误的地方继续执行。
虚拟内存区域(VMA: Virtual Memory Area):
linux将进程虚拟空间中的一个段叫做虚拟内存区域。windows叫做虚拟段。
如果你能看懂上面的定义和解释就不用往下看了……
2. 第二部分:如果你看不懂上面的,请看这里
如果你看不懂,没关系,我给出了一个简单的例子,通过这个例子,我想你应该能明白个八九不离十了。
2.1. 举例子(背景)
我想将页错误讲清楚明白,这里举个纯粹的例子。
看图
2.1.1 进程及页映射
假设我这个进程ADD是计算 1+1 1+2 1+3 ……到 1+100000的值。
由图可知,现在由于可执行文件到虚拟空间中只映射了VP0~VP7这8个页,并且其中的计算都在这些页中标识。
并且VP0 VP1 VP7都已经映射到物理内存页的PP0 PP2 PP3处。
2.1.2 映射关系和数据结构
图中从左到右依次是:进程的可执行文件(存储在磁盘中) – 进程虚拟地址空间 – 物理内存地址空间
映射关系1(绿色):指的是可执行文件到虚拟地址空间的映射,其映射关系保持在操作系统数据结构1中。
映射关系2(紫色):指的是虚拟地址空间到物理内存页直接的映射,其映射关系保持在操作系统数据结构2中。
2.2 结合图说明什么是页错误
2.2.1 页错误产生
简单点说就是:
进程ADD执行1+1时,从操作系统保存的数据结构2中可以查到映射关系2,
由于其进程虚拟空间页VP0已经映射到物理内存页PP0处,所以CPU执行,OK,结果是2。完成!
进程ADD执行1+2时,从操作系统保存的数据结构2中可以查到映射关系2,
由于其进程虚拟空间页VP1已经映射到物理内存页PP2处,所以CPU执行,OK,结果是3。完成!
进程ADD执行1+3时,从操作系统保存的数据结构2中可以查到映射关系2,
由于其进程虚拟空间页VP7已经映射到物理内存页PP3处,所以CPU执行,OK,结果是4。完成!
进程ADD执行1+4时,从操作系统保存的数据结构2中查不到VP2与物理内存对于的映射关系。
怎么办?
怎么办?
2.2.2 页错误处理
此时,CPU控制权由进程ADD交给操作系统,操作系统去查询保存的数据结构1(保存的是可执行文件到虚拟地址空间的映射)
通过该DP0页面所在的VMA虚拟内存区域,然后在VMA计算出页面在ELF(可执行文件)中的偏移,最后从物理内存中分配一个物理页面,并将该物理页面和进行虚拟地址建立映射关系。
最后将CPU控制权交给ADD进程,从刚才页错误的地方继续执行,OK,结果是5,完成!
虚拟内存区域(VMA: Virtual Memory Area):
linux将进程虚拟空间中的一个段叫做虚拟内存区域。windows叫做虚拟段。
参考:
https://blog.csdn.net/lqy971966/article/details/106910746
完成!