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