3

如果我们取消引用用户空间和内核空间中的空指针会发生什么?

据我了解,行为基于编译器、架构等。

但通常对于分配有虚拟内存的每个用户空间程序,分页用于使用页表将虚拟地址转换为物理地址。

因此,如果我们在用户空间中取消引用空指针,则该地址无效,因此将发生上下文切换,并且在内核中基于此空指针取消引用的中断“将出现分段错误或将出现页面错误错误”。

在内核空间中:

如果我们取消引用 NULL 指针,则可能会导致系统崩溃或内核可能无法从该调用返回。

我的理解是否正确?或任何其他信息缺失意味着请解释。

参考:我从这个“当我们在 C 中取消引用 NULL 指针时,OS 会发生什么?

4

1 回答 1

3

内核将虚拟地址 0 处的页面映射到所有未设置权限位的进程。当您尝试访问该页面时,您会得到一个page fault。处理它的内核例程向您的进程发出SIGSEGV 信号。如果您没有SIGSEGV注册处理程序,核心将被转储,并且您会看到“分段错误”消息。

内核方面,情况有点不同。毕竟,内核应该是健壮的:

  • 如果取消引用发生并且可以恢复(例如,您的触控板驱动程序犯了错误),则会生成内核 oops 。内核继续运行(目前)。
  • 如果取消引用导致无法恢复,Oops 会导致内核恐慌。需要重启。
  • 如果由于某种原因,在第 0 页映射了数据,则会损坏内存。这可能会导致恐慌,被忽视甚至被滥用于特权升级攻击
于 2016-02-06T13:05:41.743 回答