当 Linux 系统中发生页面错误时,中断处理程序必须找出页面错误发生的原因。但是怎么样?
Gil*_*il' 13
当内存访问失败时会发生页面错误,因为 MMU 对虚拟地址的查找以无效描述符结束或以指示缺乏权限的描述符(例如,对只读页面的写入尝试)结束。当页面错误发生时,处理器执行一些动作;细节特定于每个处理器架构,但要点是相同的:
举个例子,在(32位)ARM处理器上:
dfsr寄存器被设置为描述故障的值(无论是由于读还是写、处理器指令或 DMA 等)。dfar寄存器设置为作为导致故障的访问目标的虚拟地址。lr寄存器在发生故障时被设置为程序计数器,并且该spsr寄存器在发生故障时被设置为程序状态寄存器(cpsr包含模式位的寄存器)。sp和cpsr寄存器被编组:它们从值恢复最后一组在中止模式。页错误处理程序的代码是操作系统内核的一部分。它的工作是分析故障原因并对其采取措施。它可以查询提供有关故障性质信息的专用寄存器,如果需要,它还可以检查程序正在执行的指令。它还可以在 MMU 表中查找描述符;无效描述符有时可以编码信息,例如交换空间中页面的位置。内核通过查看它在每次上下文切换时更新的全局变量或寄存器的值来知道当前正在执行哪个任务。以下是页面错误的一些常见行为:
通常无法确定异常即将发生,除非了解虚拟内存配置并在访问内存之前进行检查。正常的操作流程是在页面错误发生时处理器记录页面错误的原因。