总线错误(Bus Error)是什么?
总线错误(Bus Error) 是一种硬件或系统级错误,通常发生在进程试图访问一个在物理上或权限上无效的内存地址时。
在类Unix系统(如Linux、macOS)中,当进程触发了总线错误时,操作系统会向该进程发送一个 SIGBUS 信号,默认行为是终止进程并可能产生核心转储(core dump)。
这与 段错误(Segmentation Fault, SIGSEGV) 很相似,但两者有细微而关键的区别。简单来说:
- 段错误 (SIGSEGV):通常与内存权限相关,例如尝试写入只读内存,或者访问尚未映射到进程地址空间的虚拟内存。
- 总线错误 (SIGBUS):通常与内存的对齐方式或物理地址相关,即你访问的内存地址是有效的(已映射),但访问这个地址的方式是错误的。
导致总线错误(SIGBUS)的常见条件
以下是几种最常见导致总线错误的情况:
1. 内存访问未对齐(Unaligned Memory Access)
这是最常见的原因。许多计算机架构(如SPARC, 早期的ARM, PowerPC)要求数据在内存中的地址必须是对齐的。
-
什么是对齐? 例如,一个4字节(32位)的整数必须存储在能被4整除的地址上。一个8字节(64位)的双精度浮点数必须存储在能被8整除的地址上。
-
错误示例:
#include <stdio.h> int main() { char data[10] = { 0}; // 强制将一个 int 指针指向一个可能未对齐的地址(比如 data[1] 的地址是奇数) int *ptr = (

最低0.47元/天 解锁文章
530

被折叠的 条评论
为什么被折叠?



