Chinaunix
标题:
x86在内存不对齐的时候,为什么不会产生总线错误?
[打印本页]
作者:
asker160
时间:
2010-11-24 11:08
标题:
x86在内存不对齐的时候,为什么不会产生总线错误?
在有些机器上(例如sun的spark,intel的itanium),内存不对齐就会产生总线错误,例如下面这两行C代码:
char buf[8];
int* pi=buf+1;
(*pi)=2;
在spark上面就打印Bus error然后core dump。
但是在PC上面就能顺利通过,没有什么问题。
能否简单的解释一下呢,x86是怎么通过的,设计上有什么不一样?
我初学,请大虾就这个问题给个容易懂的解释,而不是建议我去啃某本大砖头,谢谢了!
作者:
snail_314
时间:
2010-11-24 14:43
the art of design is "TradeOff"
作者:
erlv
时间:
2010-11-24 14:44
X86上有些支持非对齐访存的指令,另外,操作系统也可以handle一些bus error错误。
没什么设计上的不同。这种非对齐访存基本内部实现都是用两条对齐操作,加一个拼装操作完成,效率很低。
作者:
dibug
时间:
2010-11-24 20:48
在x86里,如果寻址不align,首先效率上要打些折扣~
作者:
erazy0
时间:
2010-12-05 20:09
同意3楼
作者:
garyv
时间:
2010-12-07 15:45
楼主用spark平台?做什么的呢?
作者:
cjaizss
时间:
2010-12-08 08:35
本帖最后由 cjaizss 于 2010-12-08 08:39 编辑
X86是CISC机器,且支持奇数边界访问的CISC.这多少是牺牲了效率换来的,尽管有一套完备的比如cache机制什么的。不过现在似乎看起来也相差无几。而RISC,则一般不支持奇边界。
作者:
cjaizss
时间:
2010-12-08 08:35
另外,是SPARC,不是spark
作者:
qucklay
时间:
2010-12-11 13:36
从不关心奇地址,只注重实现,不注重效率
作者:
qucklay
时间:
2010-12-11 13:49
记得书上说X86的内存地址的9位每字节,有一位奇偶校验位,是由硬件自动添上的。另外也煞有介事的说内存地址不对齐的代价是很大的。。
作者:
lzj123
时间:
2011-03-13 16:22
查查用的编译器的选项,可以设为不用对齐,这样估计效率可能地一些。
作者:
Cyberman.Wu
时间:
2011-06-24 16:39
内存内部结构设计注定每次只能访问总线位数对齐的地址,指令中允许非对齐访问只是因为CPU或Memory Controller上做了处理,跨对齐的访问硬件上实际会访问两次内存,性能损失不是很明显,但CPU/MC复杂了;有些平台上是用软件中断来做的,这样应用程序也不用关心,但性能明显会差许多。
这个算是设计上的一种权衡吧,也不是严格的RISC或CISC的区别,RISC芯片中的PowerPC系列和x86一样,是允许非对齐访问的,只有连续操作几个寄存器的一些指令(好像是叫lmw还是lwm吧)有这个约束,非对齐会出异常。
作者:
cjaizss
时间:
2011-06-25 10:25
内存内部结构设计注定每次只能访问总线位数对齐的地址,指令中允许非对齐访问只是因为CPU或Memory Controll ...
Cyberman.Wu 发表于 2011-06-24 16:39
现在CISC和RISC都结合起来设计了,严格意义上的RISC已经不多了
作者:
Cyberman.Wu
时间:
2011-06-27 15:22
回复
13#
cjaizss
这个倒是真的,现在大家都更实际了,不去单纯去追求“纯...”了,好用就行。
作者:
sinoman
时间:
2011-07-18 10:16
intel 手册,AC=1 cr=1,检查边界。
windows下,cr=0
linux下, cr=1,你试一下手动置ac位,不对齐操作肯定sigbus
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2