Bus Error究竟是指什么

 http://daimajishu.iteye.com/blog/1089727

Bus Error究竟是指什么?

Bus Error,即总线错误。

引发原因:

CPU处于性能方面的考虑,要求对数据进行访问时都必须是地址对齐的。如果发现进行的不是地址对齐的访问,就会发送SIGBUS信号给进程,使进程产生 core dump。RISC包括SPARC(一种微处理器架构)都是这种类型的芯片。x86系列CPU都支持不对齐访问,也提供了开关禁用这个机制。x86架构不要求对齐访问的时候,必定会有性能代价。例如,对int的访问应该是4字节对齐的,即地址应该是4的倍数,对short则是2字节对齐的,地址应该是2的倍数。

Bus Error也有可能是因为机器物理问题或者访问无效物理地址,但这种情况非常少见。

Linux平台上执行malloc(),如果没有足够的RAM,Linux不是让malloc()失败返回,而是向当前进程分发SIGBUS信号。
注: 对该点执怀疑态度,有机会可自行测试确认当前系统反应。

SIGBUS与SIGSEGV信号的一般区别如下:

1) SIGBUS(Bus error)意味着指针所对应的地址是有效地址,但总线不能正常使用该指针。通常是未对齐的数据访问所致。

2) SIGSEGV(Segment fault)意味着指针所对应的地址是无效地址,没有物理内存对应该地址。

 

http://www.cppblog.com/mmdengwo/archive/2011/04/25/144954.aspx

我们经常会发现有两种内存转储(core dump)  
  一种是段故障(segment fault)通常是在一个非法的地址上进行取值赋值操作造成。  
  一种是总线错误(bus error)通常是指针强制转换,导致CPU读取数据违反了一定的总线规则。

首先,core就是内存的意思,在半导体应用之前,内存是由铁氧化物圆环制造的(core),但一直沿用至今。

而这两种错误,都是有硬件告知操作系统一个有问题的内存引用。操作系统通过信号,再将错误信息告知进程。缺省情况下,进程收到“总线错误”或“段错误”信号后,将信息转储并终止。当然也可以为这些信号设置一个信号处理程序(signal handler)。

总线错误(bus error),几乎都是有内存未对齐读引起的。内存对齐,就是内存变量的地址只能是其大小的整数倍,这样存储的目的就是为了方便并快速存取内存。一般情况下,编译器都会做好内存对齐工作,为什么又会引发段故障呢?很多情况就是由指针和强制类型转换引起的,如:

union{

    char a[10];

    int i;

}u;

int *p = (int *)&(u.a[1]);

*p = 17;


 

当然,还有一些其它原因会引起“总线错误”,如奇偶校验码错误,所引用的内存块不存在。但是现在,内存都有硬件电路检测和修正,一般不会再传到软件层了;除了驱动程序,一般也不会引用不存在的内存块。

段错误,一般是由于引用不位于自己的地址空间的地址引起的。最常见的就是通过一个未初始化,或者有非法值的指针引起的,如:int *p = 0; *p = 7; 而导致指针的非法值可能是由于不同的编程错误引起的,比起“总线错误”更加间接。

段错误一般是由硬件段表转换机构的错误引发,如Sun硬件中的内存管理单元(MMU)。

还有一个微妙之处是,如果未初始化的指针恰好具有未对齐的值,它将产生总线错误,而不是段错误。

 

你可能感兴趣的:(Linux,C/C++,嵌入式)