给定一个线性地址,MMU 通过页目录表、页表的转换,找到对应的物理地址。在这个过程中,如果因某种原因导致无法访问到最终的物理内存单元,CPU 会产生一次缺页异常,从而进入缺页异常处理程序

       总结一下,缺页异常的原因有以下几种: 

1、导致缺页异常的线性地址根本不在进程的“虚存区间”中,段错误。(栈扩展是一种例外情况)

2、地址在“虚存区间”中,但“虚存区间”的访问权限不够;例如“区间”是只读的,而你想写,段错误

3、权限也够了,但是映射关系没建立;先建立映射关系再说

4、映射关系也建立了,但是页面不在内存中。肯定是换出到交换分区中了,换进来再说

5、页面也在内存中。但页面的访问权限不够。例如页面是只读的,而你想写。这通常就是 “写时拷贝COW” 的情况

6、缺页异常发生在“内核动态映射空间”。这是由于进程进入内核后,访问一个通过 vmalloc() 获得线性地址而引起的异常。对这种情况,需要将内核页目录表、页表中对应的映射关系拷贝到进程的页目录表和页表中。

本文转自:http://www.xuebuyuan.com/1500964.html

       从第4条原因可以看出“虚拟内存”即:指计算机呈现出要比实际拥有的内存大得多的内存量。使得应用程序认为自己有足够可用的连续内存空间,而实际上,它不仅通常被分割为多个物理内存碎片,而且还有部分存在于磁盘上,每次缺页中断时才调入内存。

GitHub 加速计划 / li / linux-dash
10.39 K
1.2 K
下载
A beautiful web dashboard for Linux
最近提交(Master分支:2 个月前 )
186a802e added ecosystem file for PM2 4 年前
5def40a3 Add host customization support for the NodeJS version 4 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐