未对齐的内存访问

时间:2013-10-14 01:24:30

标签: c memory assembly kernel

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

我目前使用的是带有Linux内核的x86英特尔,但是本着主题和操作系统不可知论的精神来讨论这个话题 - 尽管以下是 而不是 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");

给出“想要的”结果:

Bus error (core dumped)

(但perf中仍然没有留言。)


我的问题是硬件+操作系统如何处理这个问题以及最佳方法。我的想法和问题到处都是,但我会试着说出一些具体的观点:

  1. 默认情况下CPU是否在上进行对齐检查,但内核检测到 off 是否受支持并指示不检查
  2. 作为内核,至少我在其他硬件上经历过这种情况,由于某些驱动程序试图访问未对齐的内存,可以获得oops:内核是否运行对齐检查 -mode?或者它可能只是代码的某些部分呢?
  3. 由于未对齐内存的访问需要更多资源;在软件的测试阶段,通过例如上面的装配线启用对齐检查是一个好主意吗?这会让它更便携吗?
  4. 我对此有很多疑问,但现在就把它留在这里。

1 个答案:

答案 0 :(得分:2)

试着给出部分答案。

  

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

它取决于拱形,甚至在相同的拱形上,可能是HW上可以处理未对齐内存上的某些指令,而其他指令则不能。

  

作为内核,至少我在其他硬件上经历过这个,可以得到   由于某些驱动程序试图访问未对齐的内存而导致的oops:是吗?   内核在对齐检查模式下运行?或者也许只是肯定   代码的一部分呢?

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

  

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

在实践中,如果你在一个大型项目中有很多遗留代码,那可能不是一个好主意.....但它应该对新代码有用。