linux内核中的分段错误后会发生什么?

时间:2013-08-09 11:13:24

标签: linux segmentation-fault page-fault

当我考虑进行网络分页(从远程节点请求错误页面)时,我遇到了这个问题:

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

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

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

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

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

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

6)接下来的问题是:在此之后,X上有页面错误的程序会安全地读取数据吗?然后,是否意味着MMU或CPU以某种方式记住页面错误页面表项并返回该条目并继续走页表?

如果任何步骤不对,请赐教。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

解决方案很棘手且不便携。

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