非法内存引用(终止)

非法内存引用触发的是同步异常中的终止(Abort)类型,通常表现为段错误(Segmentation Fault)。

触发场景

  • 解引用空指针(NULL0 地址)。
  • 访问未映射到进程地址空间的虚拟地址。
  • 写入只读内存区域(如修改字符串常量)。
  • 栈溢出导致访问无效栈地址。

处理流程

  1. CPU 检测到内存访问违例,触发故障异常。
  2. 内核缺页处理程序检查发现该地址不存在于进程的任何VMA中,或访问权限不匹配。
  3. 处理程序判定为不可修复的非法访问。
  4. 内核向进程发送 SIGSEGV 信号(信号编号11)。
  5. 如果没有自定义 SIGSEGV 信号处理程序,进程默认终止并产生核心转储(core dump)。

与缺页的区别:缺页故障中虚拟地址合法但页面不在内存中(可修复);非法内存引用中虚拟地址根本不合法(不可修复)。两者都触发故障异常,但错误处理和结果截然不同。

段错误是学习C/C++编程时最常遇到的运行时错误之一,本质上是操作系统内存保护机制在起作用——系统检测到问题后强制终止程序以防止破坏扩散。

链接到