【发布时间】:2010-05-19 23:43:29
【问题描述】:
我一直在研究 x86 上的 Linux elf 可执行文件,主要使用 IDA,但 还有gdb。我注意到的一件事是函数总是被加载 在字对齐的地址?有谁知道其中的原因? 我不知道启动 x86 指令的任何要求 在对齐的地址。并且不能是由于页面对齐的原因 页面边界仍然可以在函数内的任何位置。
如果有任何见解,我将不胜感激。
谢谢。
【问题讨论】:
我一直在研究 x86 上的 Linux elf 可执行文件,主要使用 IDA,但 还有gdb。我注意到的一件事是函数总是被加载 在字对齐的地址?有谁知道其中的原因? 我不知道启动 x86 指令的任何要求 在对齐的地址。并且不能是由于页面对齐的原因 页面边界仍然可以在函数内的任何位置。
如果有任何见解,我将不胜感激。
谢谢。
【问题讨论】:
你是对的,指令不需要对齐。在 x86 处理器上,汇编指令使用从 1 到至少 15 个字节的可变长度代码进行编码。
但是指令是从通常以 64 字节对齐的缓存中读取的,并且当代码正确对齐时,执行管道的某些部分运行得更快:解码、循环、分支预测等。
这方面的最佳信息来源是 Agner Fog 的文档:http://www.agner.org/optimize/
【讨论】:
对于某些架构,数据的对齐方式决定了每次操作可以复制的数据量。例如,尝试从地址 0x4000 复制 32 位可能需要一次 32 位移动操作,而从 0x4001 复制 32 位可能需要 4 次 8 位移动操作。此外,对未对齐的地址使用 32 位移动指令可能会触发硬件异常。硬件异常通过一次复制 8 位来处理,但比从对齐地址复制要慢。
编辑:
这适用于所有数据,而不仅仅是将要执行的数据。因此,函数入口点与切换目标、字符串常量、全局变量和其他数据对齐。
【讨论】: