我正在玩C中的内存地址,并想知道这个主题名为未对齐的内存访问。未对齐的内存访问
我目前在x86的英特尔与Linux内核,但问的话题拱和操作系统不可知论的精神 - 尽管下面是而 Linux和HW具体:
当我读/写一个简单的类型从/到一个不对齐的地址我没有任何错误。日志中没有消息或任何东西。我也试过:
perf top -e alignment-faults
# And with PID
perf top -p NNN -e alignment-faults
但没有命中。
通过打开alignment checking:
__asm__("pushf\norl $0x40000,(%esp)\npopf");
给“通缉令”结果:(但仍然没有在perf
消息)
Bus error (core dumped)
我的问题这是怎么处理的硬件是+操作系统和什么是最佳的。我的想法和问题是所有的地方,但我会尽力短语一些具体要点:
- 是否CPU具有对准上默认检查,但内核发现关闭支持和指示它到不检查?
- 作为内核,至少我在其他硬件上经历过这种情况,可能由于某些驱动程序试图访问未对齐的内存而得到oops:内核是否在对齐检查中运行 -mode?或者,它可能只是代码的某些部分呢?
- 由于未对齐内存的访问需要更多资源;在软件的测试阶段启用对齐检查是一个不错的主意,例如通过装配线上面的流水线?这是否也会使它更便携?
我对此有更多的问题,但现在就把它留在这里。
为什么对齐甚至是一个话题的一个重要原因是因为一些体系结构检查和一个/一些不。那些可能会或可能没有启用/禁用。此外,检查是在硬件中完成的,以致于存储器/读取周期出现故障。 –
从内存工作......我相信,英特尔(CISC)芯片可以管理未对齐的写入 - 速度快。一般来说,RISC芯片(我相信其他SPARC)会在请求访问未对齐的数据时产生总线错误(奇数内存地址上的2字节数量;地址上的4字节数量不是4个字节)等。一些芯片(DEC Alpha)产生一个内核陷阱并处理内核中未对齐的访问 - 这是非常慢的。有一个命令“uam”来控制程序是否在未对齐的内存访问上崩溃或内核陷阱发生。 –
对于你的第一个问题,我不认为有开/关模式,这更像是操作系统或编译器能否在软件中处理由未对齐的内存访问引发的问题。 如果可以处理,那么我看不到为什么它会关闭某些代码而没有启用其他某些代码。 希望你找到以下两个有用的链接, http://msdn.microsoft.com/en-us/library/aa290049%28v=vs.71%29.aspx http://lwn.net/Articles/ 260832/ – AquaAsh