c - 未对齐的内存访问

标签 c memory assembly kernel

我正在研究 C 中的内存地址,并对这个名为未对齐内存访问的主题感到好奇。

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


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

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

但没有点击。

开启 alignment checking作者:

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

给出“想要的”结果:

Bus error (core dumped)

(但 perf 中仍然没有消息。)


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

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

我对此还有很多疑问,但现在就先到此为止。

最佳答案

尝试给出部分答案。

Does the CPU have alignment checking on by default, but the kernel detects that off is supported and instructs it to do not check?

这取决于架构,甚至在相同的架构上,也可能是未对齐内存上的某些指令可以由硬件处理,而其他指令则不能。

As the kernel, at least I have experienced this on other HW, can get oops due to some driver trying to access unaligned memory: does the kernel run in alignment check-mode? Or is it perhaps only certain parts of the code that does?

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

As access of unaligned memory require more resources; is it a good idea to enable alignment checking, as by for example above assembly line, in a test-phase for software? Would this also make it more portable?

实际上,如果大型项目中有大量遗留代码,这可能不是一个好主意……但对于新代码来说应该是有好处的。

关于c - 未对齐的内存访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19352232/

相关文章:

c - pthread 启动例程返回一个整数数组

c - 如何从文本文件 (C) 中读取特定数据?

c - 为什么 SHELL_Main() 在 FreeRTOS 的 xTaskCreate 中不起作用?

Python不在for循环中释放内存

python - 分块更新大型 SQLite 数据库

python - 两个基本的 ANTLR 问题

c - 方向似乎不会随着特定的电压范围而改变

haskell - 分析高性能 Haskell 代码

linux - 汇编程序中的插入排序不起作用

c++ - 如何为这个链表正确分配内存