-->
Linux使用分页管理机制来更加有效地利用物理内存.当创建一个进程时.仅仅把当前进程的一小部分真正装入内存.其余部分需要访问时.处理器产生一个页故障.由缺页中
断服务程序根据缺页虚拟地址和出错码调用写拷贝函数do--wp--page、此地址所属的vma的vm--ops指向的nopage、do--swap--page.swap--in等函数将需要的页换入物理内存。
随 着可执行映像的运行和页面的换入.系统中的内存有可能变得不足.这时Linux核心就必须调用kswapd守护进程释放部分物理内存。kswapd在系统 启动时由init进程建立。在系统的运行过程中。它被定期唤醒。检查系统中的空闲物理内存是否很少。如果是.则释放一部分内存.或者将一些页面换出到对换 空间。然后继续睡眠。
(1) 缺页中断和页面换入
页面换入主要由缺页中断服务入口函数do--page--fault来实现。当系统中产生页面故障时.如果虚拟内存地址有效.则产生错误的原因有如下两种:
· 虚拟内存地址对应的物理页不在内存中。那么它必然在磁盘或对换空间中.如果在磁盘上.那么我们调用do--nO--page函数.而do--no--page调用vma一> vm--ops一> nopage()
函数建立页面映射.从对换空间或磁盘中调入页面.或者通过do--swap--page()函数调用swap--in()来换入页面。
· 该虚拟地址对应的物理页在内存。但是被写保护.如果这种情况发生在一个共享页面上.则需要"写拷贝"函数do--wp--page来换入页面.do--wp--page函数首先调用一get--
free--page获得一新页面.然后调用copy--COW--page拷贝页面的内容.当然还要调用相应的刷新函数刷新TLB和缓存等。
(2) 页交换进程和页面换出
正 如我们上面所描述的.系统使用kswapd守护进程来定期地换出页面。使系统中有足够的空闲物理内存页。kswapd进程定期地检查系统中的空闲页面数. 如果少于一定值.则按照以下三中途径获得空闲页面:① 减少缓冲区和页面高速缓存的大小;② 把共享内存占用的页面置换到对换空间;③ 换出或丢弃物理内存页。

发表评论