2.6 请求调页:
当一个可执行映像被内存映射到进程的虚拟内存时,它就可以开始执行。就在刚开始将
该映像装入物理内存时,它就很快会访问一个还未在物理内存中的虚拟内存区(图1 - 2 - 5 )。当
进程访问一个没有有效页表项的虚拟地址时,处理器将向L i n u x报告页故障。页故障描述了发
生页故障的虚拟地址以及引起页故障的内存访问类型。
L i n u x必须找到表示发生页故障的内存区域的v m _ a r e a _ s t r u c t数据结构。因为查找
v m _ a r e a _ s t r u c t数据结构是高效处理页故障的关键,它们被一起链接到一个AV L ( A d d s e n _ Ve b s k i i
和L a n d i s )树结构中,如果不存在发生故障的虚拟地址的v m _ a r e a _ s t r u c t数据结构,那么该进程就
访问了一个非法的虚拟地址。L i n u x将通知该进程,发送一个S I G S E G V信号,并且如果该进程没
有此信号的处理器就会被终止。
L i n u x然后检查发生的页故障的类型,与本虚拟内存区所允许的访问类型比较。如果进程
以非法方式访问内存,比如写一个只读区,它同样将会被通知发生了内存错误。
现在L i n u x判定页故障是合法的,则必须处理。L i n u x必须区分在交换文件中的页和在磁
盘上其他地方并且是可执行映像的一部分的页。它通过查看故障虚拟地址的页表项来区分。
如果该页的页表项无效但不空,则页故障是当前保存在交换文件中的一页。对于A l p h a
A X P页表项来说,这些就是有效位没有置位但P F N字段值又非0的页表项。这种情况下, P F N
字段包含一些信息指明该页在交换文件中哪里(以及哪个交换文件)被保存。交换文件中的页如
何处理将在本章后面描述。
并非所有的v m _ a r e a _ s t r u c t都有一个虚拟内存操作集,即使有,有的也可能没有n o p a g e操
作。这是因为默认(缺省)情况下L i n u x将通过分配一个新物理页并创建一个有效页表项来完成
访问。如果一个虚拟内存区没有n o p a g e操作,L i n u x将使用默认方式。
一般的Linux nopage操作用在内存映射的可执行映像上,并使用页缓存把请求的页装入物
理内存。
不管怎样,所请求的页都将被装入物理内存,进程页表被更新。或许需要一些硬件相关
的动作来更新这些项,特别是当处理器使用了转换旁视缓冲器时。在此页故障被处理之后,
它可以被清除掉,进程在引起故障虚存访问的指令处重启动。