鱼思故渊的专栏

不积跬步,无以至千里;不积小流,无以成江海

缺页中断处理过程

 缺页中断就是要访问的页不在主存,需要操作系统将其调入主存后再进行访问。

当进程执行过程中发生缺页中断时,需要进行页面换入,步骤如下:

<1> 首先硬件会陷入内核,在堆栈中保存程序计数器。大多数机器将当前指令的各种状态信息保存在CPU中特殊的寄存器中。

<2>启动一个汇编代码例程保存通用寄存器及其它易失性信息,以免被操作系统破坏。这个例程将操作系统作为一个函数来调用。

(在页面换入换出的过程中可能会发生上下文换行,导致破坏当前程序计数器及通用寄存器中本进程的信息)

<3>当操作系统发现是一个页面中断时,查找出来发生页面中断的虚拟页面(进程地址空间中的页面)。这个虚拟页面的信息通常会保存在一个硬件寄存器中,如果没有的话,操作系统必须检索程序计数器,取出这条指令,用软件分析该指令,通过分析找出发生页面中断的虚拟页面。

<4>检查虚拟地址的有效性及安全保护位。如果发生保护错误,则杀死该进程。

<5>操作系统查找一个空闲的页框(物理内存中的页面),如果没有空闲页框则需要通过页面置换算法找到一个需要换出的页框。

<6>如果找的页框中的内容被修改了,则需要将修改的内容保存到磁盘上,此时会引起一个写磁盘调用,发生上下文切换(在等待磁盘写的过程中让其它进程运行)。

(注:此时需要将页框置为忙状态,以防页框被其它进程抢占掉)

<7>页框干净后,操作系统根据虚拟地址对应磁盘上的位置,将保持在磁盘上的页面内容复制到“干净”的页框中,此时会引起一个读磁盘调用,发生上下文切换。

<8>当磁盘中的页面内容全部装入页框后,向操作系统发送一个中断。操作系统更新内存中的页表项,将虚拟页面映射的页框号更新为写入的页框,并将页框标记为正常状态。

<9>恢复缺页中断发生前的状态,将程序指令器重新指向引起缺页中断的指令。

<10>调度引起页面中断的进程,操作系统返回汇编代码例程。

<11>汇编代码例程恢复现场,将之前保存在通用寄存器中的信息恢复。

其实缺页中断的过程涉及了用户态和内核态之间的切换,虚拟地址和物理之间的转换(这个转换过程需要使用MMU和TLB),同时涉及了内核态到用户态的转换。


阅读更多
文章标签: 算法
个人分类: linux内核分析
上一篇C++--何时需要定义赋值/复制构造函数
下一篇new/malloc的区别
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭