2.10 页换入:
访问一个不在物理内存中的虚拟内存页将导致页故障的发生。
页故障是处理器在通知操作系统,它不能将一个虚拟地址转换到物理地址。在这里是因为当
页被换出时描述该页虚拟内存的页表项被标识成无效。处理器不能处理虚拟地址到物理地址
的转换,所以它把控制传回操作系统,并同时描述发生页故障的虚拟地址和故障原因。
处理器相关的页故障处理
代码必须找到v m _ a r e a _ s t r u c t数据结构,该数据结构描述发生页故障处的虚拟内存区。它通过
查找进程的v m _ a r e a _ s t r u c t数据结构来进行,直到找到包含故障地址的那个。这是一段对时间
要求很严格的代码,并且进程的v m _ a r e a _ s t r u c t数据结构被组织成使这种查找耗费尽量少的时
间。
执行完处理器相关动作并发现故障虚拟地址是位于合法的虚拟内存区中,页故障处理过
程对于可运行L i n u x的所有处理器,就成为通用并且适用的。通用的页故障处理代码查找故障
虚拟地址的页表项。如果找到的页表项从属于一个换出的页, L i n u x必须把该页换回物理内存。
被换出的页表项格式是处理器相关的,但所有处理器都把这些页标识为无效,并把在交换文
件中定位该页所需的信息放进页表项中,为了把该页换入物理内存, L i n u x需要使用这些信
息。
这时, L i n u x知道了故障的虚拟地址,并有一个页表项包含该页被交换出到何处的信息。
v m _ a r e a _ s t r u c t数据结构可能含有一个指针指向一个例程,用于把它描述的虚拟内存区中任何
页换回物理内存,这是它的s w a p i n操作。如果有此虚拟内存区的s w a p i n操作,L i n u x将使用它。
事实上,它正是System V 共享内存页的处理方式:因为它需要特殊处理,来适应换出的
System V共享页的格式与普通换出页格式的差异。也可能没有s w a p i n操作,这时L i n u x将认为
它是一个普通页,不需要特殊处理。它将分配一个空闲物理页并从交换文件中读回被换出的
页。该页在交换文件中的位置信息(及哪个交换文件)将从相应无效页表项中获得。
如果引起页故障的访问不是写访问,则该页被留在交换缓存中,并且其页表项不被标识
成可写。如果该页以后被写,将发生另一个页故障,并且那时该页将被标识为“脏”,其页表
项从交换缓存中被移去。若该页没被写并且它需要再次被换出时, L i n u x可以免去把该页写到
交换文件,因为它已经在交换文件中了。
如果引起把页从交换文件读回的访问是写操作,则此页被从交换缓存中移出,并且其页
表项被标识为“脏”和“可写”。