未对齐的内存访问
我正在玩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)
(但仍然没有消息)
我的问题是硬件+操作系统如何处理这个问题以及什么是最佳的。 我的想法和问题到处都是,但我会试着说出一些具体的观点:
- CPU是否默认启用了对齐检查,但是内核检测到支持off并指示它不检查 ?
- 作为内核,至少我在其他硬件上经历过这种情况,由于某些驱动程序试图访问未对齐的内存,可以获得oops:内核是否运行在对齐检查 -mode? 或者它可能只是代码的某些部分呢?
- 由于未对齐内存的访问需要更多资源; 在软件的测试阶段,启用对齐检查是一个好主意,例如在assembly线之上? 这会使它更便携吗?
我对此有很多疑问,但现在就把它留在这里。
试着给出一个部分答案。
CPU是否默认启用了对齐检查,但是内核检测到支持off并指示它不检查?
它取决于拱形,甚至在相同的拱形上,可能是HW上可以处理未对齐内存上的某些指令,而其他指令则不能。
作为内核,至少我在其他硬件上经历过这种情况,由于某些驱动程序试图访问未对齐的内存,可以获得oops:内核是否以对齐检查模式运行? 或者它可能只是代码的某些部分呢?
HW不支持未对齐的内存访问会导致陷阱,内核具有陷阱/exception的处理程序。 我一直在研究ppc,这样的exception将根据指令处理(从PC获得); 一些指示得到处理,程序将恢复; 其他一些可能导致程序终止,因为内核无法处理它。 一个这样的例子是stwcx指令,它用于实现比较和交换逻辑。
由于未对齐内存的访问需要更多资源; 在软件的测试阶段,启用对齐检查是一个好主意,例如在assembly线之上? 这会使它更便携吗?
在实践中,如果你在一个大型项目中有很多遗留代码,那可能不是一个好主意…..但它应该对新代码有利。