第2章 内存管理:2.6 请求调页

本文详细介绍了Linux系统中请求调页机制的工作原理。当进程访问不在物理内存中的虚拟内存区域时,处理器会触发页故障。Linux通过查找vm_area_struct数据结构来处理这类故障,并根据页表项的状态决定从交换文件或磁盘加载页面。文章还解释了合法页故障的处理流程,包括物理页的分配和页表更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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操作用在内存映射的可执行映像上,并使用页缓存把请求的页装入物
理内存。
不管怎样,所请求的页都将被装入物理内存,进程页表被更新。或许需要一些硬件相关
的动作来更新这些项,特别是当处理器使用了转换旁视缓冲器时。在此页故障被处理之后,
它可以被清除掉,进程在引起故障虚存访问的指令处重启动。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值