0

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

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

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

2)MMU遍历页表找到X的物理地址。

3) 遍历页表时,发现页表项无效。

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

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

6)问题来了:在这一点之后,在 X 处发生缺页的程序会安全地读取数据吗?那么,这是否意味着 MMU 或 CPU 以某种方式记住了缺页页表条目并返回到该条目并恢复页表的行走?

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

4

2 回答 2

0

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

于 2013-11-11T18:48:16.693 回答
0

该解决方案很棘手且不可移植。

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

于 2015-06-16T09:43:32.290 回答