当一个进程运行时,CPU访问的地址是用户空间的虚拟地址。Linux采用请页机制来节约物理内存,仅把当前要使用的用户空间中的少量页载入物理内存。当访问的虚拟内存页面没有载入物理内存时,处理器向Linux报告一个页故障以及对应的故障原因。页故障的产生有以下三种原因:
(1)程序出现错误
(2)虚拟地址有效,但其对应的页当前不在物理内存中,产生缺页异常,操作系统必须从磁盘或交换文件(此页被换出)中将其载入物理内存。
(3)要访问的虚拟地址被写保护,即保护错误,操作系统必须判断:如果是某个用户进程正在写当前进程的地址空间,则发送一个信号并终止进程的运行;如果错误发生在一旧的共享页上时,要对这一共享页进行复制,这就是写时复制技术。
1、缺页异常处理程序
当一个进程执行时,如果CPU访问到一个有效的虚地址,但这个地址对应的页在内存中没有,则CPU产生一个缺页异常,同时将这个虚地址存入CR2寄存器,然后调用缺页异常处理程序。Linux缺页异常处理程序必须对产生缺页的原因进行区分:是由编程错误引起的异常,还是由访问进程用户空间的页尚未分配物理页面引起的异常。
SIGSEGV(段违例)是当一个进程执行一个无效的内存引用,或发生段错误时发送给它的信号。
缺页异常处理程序的总体方案: