Linux 核心--4.内存管理( 十 )


处理器相关页面错误处理代码将定位描叙包含出错虚拟地址对应的虚拟内存区域的vm_area_struct数据结构 。它通过在此进程的vm_area_struct中查找包含出错虚拟地址的位置直到找到为止 。这些代码与时间关系重大,进程的vm_area_struct数据结构特意安排成使查找操作时间更少 。

执行完这些处理器相关操作并且找到出错虚拟地址的有效内存区域后,页面错处理过程其余部分和前面类似 。

通用页面错处理代码为出错虚拟地址寻找页表入口 。如果找到的页表入口是一个已换出页面,Linux必须将其 交换进入物理内存 。已换出页面的页表入口的格式与处理器类型有关,但是所有的处理器将这些页面标记成无效并把定位此页面的必要信息放入页表入口中 。Linux利用这些信息以便将页面交换进物理入内存 。

此时Linux知道出错虚拟内存地址并且拥有一个包含页面位置信息的页表入口 。vm_area_struct数据结构可能包含将此虚拟内存区域交换到物理内存中的子程序:swapin 。如果对此虚拟内存区域存在swapin则Linux会使用它 。这是已换出系统V共享内存页面的处理过程-因为已换出系统V共享页面和普通的已换出页面有少许不同 。如果没有swapin操作,这可能是Linux假定普通页面无须特殊处理 。

系统将分配物理页面并将已换出页面读入 。关于页面在交换文件中位置信息从页表入口中取出 。

如果引起页面错误的访问不是写操作则页面被保留在swap cache中并且它的页表入口不再标记为可写 。如果 页面随后被写入,则将产生另一个页面错误,这时页面被标记为dirty,同时其入口从swap cache中删除 。如果页面没有被写并且被要求重新换出,Linux可以免除这次写,因为页面已经存在于交换文件中 。

如果引起页面从交换文件中读出的操作是写操作,这个页面将被从swap cache中删除并且其页表入口被标记 成dirty且可写 。

推荐阅读