2

我正在玩 C 中的内存地址,并想知道这个名为unaligned memory access的主题。

我目前使用的是带有 Linux 内核的 x86 Intel,但本着架构和操作系统不可知论的精神提出这个话题——尽管以下内容是特定于Linux 和硬件的:


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

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)

(但仍然没有消息perf。)


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

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

我还有很多关于这个的问题,但现在就这样吧。

4

1 回答 1

2

试着给出部分答案。

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

它取决于拱门,甚至在同一个拱门上,未对齐内存上的某些指令可能由硬件处理,而其他指令则不能。

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

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

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

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

于 2013-10-16T14:03:31.973 回答