总线错误(Bus Error)是什么?

总线错误(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 = (
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yashar Qian

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值