2013-10-14 43 views
2

我正在玩C中的内存地址,并想知道这个主题名为未对齐的内存访问未对齐的内存访问

我目前在x86的英特尔与Linux内核,但问的话题拱和操作系统不可知论的精神 - 尽管下面是 Linux和HW具体:


当我读/写一个简单的类型从/到一个不对齐的地址我没有任何错误。日志中没有消息或任何东西。我也试过:

perf top -e alignment-faults 
# And with PID 
perf top -p NNN -e alignment-faults 

但没有命中。

通过打开alignment checking

__asm__("pushf\norl $0x40000,(%esp)\npopf"); 

“通缉令”结果:(但仍然没有在perf消息)

Bus error (core dumped) 


我的问题这是怎么处理的硬件是+操作系统和什么是最佳的。我的想法和问题是所有的地方,但我会尽力短语一些具体要点:

  1. 是否CPU具有对准上默认检查,但内核发现关闭支持和指示它到不检查
  2. 作为内核,至少我在其他硬件上经历过这种情况,可能由于某些驱动程序试图访问未对齐的内存而得到oops:内核是否在对齐检查中运行 -mode?或者,它可能只是代码的某些部分呢?
  3. 由于未对齐内存的访问需要更多资源;在软件的测试阶段启用对齐检查是一个不错的主意,例如通过装配线上面的流水线?这是否也会使它更便携?

我对此有更多的问题,但现在就把它留在这里。

+1

为什么对齐甚至是一个话题的一个重要原因是因为一些体系结构检查和一个/一些不。那些可能会或可能没有启用/禁用。此外,检查是在硬件中完成的,以致于存储器/读取周期出现故障。 –

+2

从内存工作......我相信,英特尔(CISC)芯片可以管理未对齐的写入 - 速度快。一般来说,RISC芯片(我相信其他SPARC)会在请求访问未对齐的数据时产生总线错误(奇数内存地址上的2字节数量;地址上的4字节数量不是4个字节)等。一些芯片(DEC Alpha)产生一个内核陷阱并处理内核中未对齐的访问 - 这是非常慢的。有一个命令“uam”来控制程序是否在未对齐的内存访问上崩溃或内核陷阱发生。 –

+0

对于你的第一个问题,我不认为有开/关模式,这更像是操作系统或编译器能否在软件中处理由未对齐的内存访问引发的问题。 如果可以处理,那么我看不到为什么它会关闭某些代码而没有启用其他某些代码。 希望你找到以下两个有用的链接, http://msdn.microsoft.com/en-us/library/aa290049%28v=vs.71%29.aspx http://lwn.net/Articles/ 260832/ – AquaAsh

回答

2

只是试图给出部分答案。

默认情况下CPU是否有对齐检查,但内核 检测到关闭被支持并指示它不检查?

它依赖于拱门,甚至在同一个拱门上,它可能是一些关于未对齐内存的指令可以由硬件处理,而另一些则不能。

内核,至少我在其他HW遇到过,可以得到由于一些司机试图访问未对齐的内存 哎呀:确实在调整检查模式的 内核运行?或者,它可能只是某些 部分代码呢?

硬件不支持未对齐的内存访问将导致陷阱和内核具有陷阱/异常的处理程序。 我一直在ppc上工作,这种异常将根据指令处理(从PC获得);一些指令被照顾并且程序将恢复;一些其他人可能会导致程序因内核无法处理而终止。一个这样的例子是用于实现比较和交换逻辑的stwcx指令。

由于访问未对齐的内存需要更多资源;在软件的测试阶段,通过例如上面的程序集 行来启用对齐检查是否是一个很好的想法?这是否也会使它更便携?

实际上,如果您在大型项目中有大量遗留代码,这可能不是一个好主意.....但它对新代码应该很好。