缺页中断机构
总而言之:
对于我们的缺页的访问,会发生一个缺页中断。(缺页中断由当前指令发出,所以属于内中断)
中断后该程序就阻塞了,然后等待中断程序结束,再执行。
中断程序判断,内存中是否有空闲内存块:
- 如果有,就调入该内存块,并且修改页表项。
- 如果没有,则启动调度算法选择一个页面淘汰。调入该页面。
如果这个淘汰的页面有被修改过,那么就要把它重新写进外存。没有修改就直接淘汰。(所以说,我们从外存调入内存,是进行的复制。)
产生缺页中断的几种情况
1、当内存管理单元(MMU)中确实没有创建虚拟物理页映射关系,并且在该虚拟地址之后再没有当前进程的线性区(vma)的时候,可以肯定这是一个编码错误,这将杀掉该进程;
2、当MMU中确实没有创建虚拟页物理页映射关系,并且在该虚拟地址之后存在当前进程的线性区vma的时候,这很可能是缺页中断,并且可能是栈溢出导致的缺页中断;
3、当使用malloc/mmap等希望访问物理空间的库函数/系统调用后,由于linux并未真正给新创建的vma映射物理页,此时若先进行写操作,将和2产生缺页中断的情况一样;若先进行读操作虽然也会产生缺页异常,将被映射给默认的零页,等再进行写操作时,仍会产生缺页中断,这次必须分配1物理页了,进入写时复制的流程;
4、当使用fork等系统调用创建子进程时,子进程不论有无自己的vma,它的vma都有对于物理页的映射,但它们共同映射的这些物理页属性为只读,即linux并未给子进程真正分配物理页,当父子进程任何一方要写相应物理页时,导致缺页中断的写时复制;
步骤
当进程执行过程中发生缺页中断时,需要进行页面换入,步骤如下:
-
首先硬件会陷入内核,在堆栈中

缺页中断是操作系统管理内存时的一种机制,用于处理虚拟地址到物理地址映射未找到的情况。当发生缺页中断时,进程会被阻塞,然后操作系统会检查内存是否有空闲页框。如果有,就调入页面并更新页表;如果没有,会通过页面置换算法淘汰一页。淘汰页如果被修改过,需先写回磁盘。这个过程涉及用户态到内核态的切换、虚拟地址到物理地址的转换,以及可能的上下文切换。页面内容从磁盘读取后,更新页表并恢复进程执行。
最低0.47元/天 解锁文章
2131

被折叠的 条评论
为什么被折叠?



