非法内存引用(终止)
非法内存引用触发的是同步异常中的终止(Abort)类型,通常表现为段错误(Segmentation Fault)。
触发场景:
- 解引用空指针(
NULL或0地址)。 - 访问未映射到进程地址空间的虚拟地址。
- 写入只读内存区域(如修改字符串常量)。
- 栈溢出导致访问无效栈地址。
处理流程:
- CPU 检测到内存访问违例,触发故障异常。
- 内核缺页处理程序检查发现该地址不存在于进程的任何VMA中,或访问权限不匹配。
- 处理程序判定为不可修复的非法访问。
- 内核向进程发送
SIGSEGV信号(信号编号11)。 - 如果没有自定义
SIGSEGV信号处理程序,进程默认终止并产生核心转储(core dump)。
与缺页的区别:缺页故障中虚拟地址合法但页面不在内存中(可修复);非法内存引用中虚拟地址根本不合法(不可修复)。两者都触发故障异常,但错误处理和结果截然不同。
段错误是学习C/C++编程时最常遇到的运行时错误之一,本质上是操作系统内存保护机制在起作用——系统检测到问题后强制终止程序以防止破坏扩散。