我正在玩 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
。)
我的问题是硬件+操作系统如何处理这个问题,什么是最佳的。我的想法和问题到处都是,但我会尝试表达一些具体的观点:
- CPU是否默认开启对齐检查,但内核检测到支持关闭并指示它不检查?
- 作为内核,至少我在其他硬件上经历过这种情况,由于某些驱动程序试图访问未对齐的内存,可能会出现 oops:内核是否在对齐检查模式下运行?或者它可能只是代码的某些部分?
- 由于访问未对齐的内存需要更多资源;在软件的测试阶段启用对齐检查是否是一个好主意,例如上面的装配线?这也会使它更便携吗?
我还有很多关于这个的问题,但现在就这样吧。