linux内核出现分段错误后会发生什么?

linux内核出现分段错误后会发生什么?,linux,segmentation-fault,page-fault,Linux,Segmentation Fault,Page Fault,当我考虑进行网络寻呼(从远程节点请求故障页面)时,我遇到了以下问题: 首先,我们考虑以下步骤: 1) 用户空间程序试图访问内存X 2) MMU遍历页表以查找X的物理地址 3) 在遍历页表时,会注意到页表条目无效 4) CPU陷阱并被Linux陷阱向量捕获。(以ARM为例,但我认为x86也是一样的,对吗?) 5) 此时,我可以从远程节点检索适当的数据,复制到某个物理地址,并将其映射到页面表中 6) 这里有一个问题:在这一点之后,在X出现页面错误的程序会安全地读取数据吗?那么,这是否意味着MMU或C

当我考虑进行网络寻呼(从远程节点请求故障页面)时,我遇到了以下问题:

首先,我们考虑以下步骤:

1) 用户空间程序试图访问内存X

2) MMU遍历页表以查找X的物理地址

3) 在遍历页表时,会注意到页表条目无效

4) CPU陷阱并被Linux陷阱向量捕获。(以ARM为例,但我认为x86也是一样的,对吗?)

5) 此时,我可以从远程节点检索适当的数据,复制到某个物理地址,并将其映射到页面表中

6) 这里有一个问题:在这一点之后,在X出现页面错误的程序会安全地读取数据吗?那么,这是否意味着MMU或CPU会以某种方式记住页面错误的页面表条目,并返回该条目并恢复页面表的遍历


如果有任何一个步骤不正确,请告诉我。

数据中止处理程序只为
pc
分配与数据中止处理开始前相同的值,指令再次执行,正确的数据到位,因此数据中止不会再发生。

解决方案很棘手,不可移植


发生分段错误时,可以从信号处理程序(链接:)获取CPU寄存器的值。您需要分析这些问题,以决定是否能够解决问题。首先,您需要检查指令指针是否有效。然后,您需要检查错误地址是否在有效范围内。然后,需要使用mmap()系统调用为不存在的页面映射内存。然后,您需要将所需的数据复制到这些页面。信号处理程序返回后,进程将从发生分段错误的位置恢复。

应用程序级用户程序和内核不是一回事。内核处理来自用户程序的页面错误和SIGSEGV。阅读,维基网页。内核代码不应该是page-fault.Oops-right。内核代码不应出现页面错误。我的意思是用户空间应用程序。问题解决了。内核做了正确的工作,要么向应用程序进程发送一个
SIGSEGV
,要么让数据在RAM中可用。问题是,当内核做这项工作时,应用程序在读取变量x时停止。内核完成任务后,应用程序的PC是否开始“读取变量x”(例如asm ld r0,[x])?或者某种内部指令状态存储在某个地方,并从MMU页表遍历开始?它可能是特定于体系结构的。在x86上,重新启动相同的机器指令。特别是,不改变地址空间或错误地址的
SIGSEGV
处理程序将无限重复。