未对齐的内存访问

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

我目前使用的是带有Linux内核的x86英特尔,但是本着主题和操作系统不可知论的精神来讨论这个主题 – 尽管以下是Linux和HW特定的:


当我从/向未对齐的地址读取/写入简单类型时,我没有错。 日志或任何内容中没有消息。 我也尝试过:

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

但没有命中。

通过以下方式启用对齐检查

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

给出“通缉”结果:

 Bus error (core dumped) 

(但仍然没有消息)


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

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

我对此有很多疑问,但现在就把它留在这里。

试着给出一个部分答案。

CPU是否默认启用了对齐检查,但是内核检测到支持off并指示它不检查?

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

作为内核,至少我在其他硬件上经历过这种情况,由于某些驱动程序试图访问未对齐的内存,可以获得oops:内核是否以对齐检查模式运行? 或者它可能只是代码的某些部分呢?

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

由于未对齐内存的访问需要更多资源; 在软件的测试阶段,启用对齐检查是一个好主意,例如在assembly线之上? 这会使它更便携吗?

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