(SPARC) 使用 -xmemalign 选项控制编译器对数据对齐所做的假定。通过控制可能会出现非对齐内存访问的代码和出现非对齐内存访问时的处理程序,可以更轻松的将程序移植到 SPARC。
指定最大假定内存对齐和非对齐数据访问的行为。必须有一个同时用于 a(对齐)和 b(行为)的值。a 指定最大假定内存对齐,b 指定未对齐内存访问行为。
对于可在编译时确定对齐的内存访问,编译器会为该数据对齐生成适当的装入/存储指令序列。
对于不能在编译时确定对齐的内存访问,编译器必须假定一个对齐以生成所需的装入/存储序列。
如果运行时的实际数据对齐小于指定的对齐,则未对齐的访问尝试(内存读取或写入)生成一个陷阱。对陷阱的两种可能响应是
操作系统将陷阱转换为 SIGBUS 信号。如果程序无法捕捉到信号,则程序终止。即使程序捕捉到信号,未对齐的访问尝试仍将无法成功。
操作系统通过翻译未对齐的访问并将控制返回给程序(仿佛访问已成功正常结束)来处理陷阱。
下表列出了 -xmemalign 的对齐值和行为值。
表 A–38 -xmemalign 对齐值和行为值
a |
b | ||
---|---|---|---|
1 |
假定最多 1 字节对齐。 |
i |
解释访问并继续执行。 |
2 |
假定最多 2 字节对齐。 |
s |
产生信号 SIGBUS。 |
4 |
假定最多 4 字节对齐。 |
f |
仅限于 -xarch=v9 变体: 为小于或等于 4 的对齐产生信号 SIGBUS,否则解释访问并继续执行。对于其他所有 -xarch 值,f 标志与 i 等效。 |
8 |
假定最多 8 字节对齐。 | ||
16 |
假定最多 16 字节对齐。 |
如果要链接到某个已编译的目标文件,并且编译该目标文件时 b 的值设置为 i 或 f,就必须指定 -xmemalign。有关在编译时和链接时都必须指定的所有编译器选项的完整列表,请参见3.3.3 编译时选项和链接时选项。
以下缺省值仅适用于未使用 -xmemalign 选项时:
-xmemalign=8i(适于所有 v8 体系结构)。
-xmemalign=8s(适于所有 v9 体系结构)。
在有 -xmemalign 选项但未提供值时,缺省值为:
-xmemalign=1i(对于所有 -xarch 值)。
下表说明了如何使用 -xmemalign 来处理不同的对齐情况。
表 A–39 -xmemalign 示例
命令 |
情况 |
---|---|
-xmemalign=1s |
所有内存访问均未对齐,从而导致陷阱处理非常慢。 |
-xmemalign=8i |
在发生错误的代码中存在偶然的、有目的的、未对齐访问。 |
-xmemalign=8s |
程序中应该没有任何未对齐访问。 |
-xmemalign=2s |
要检查可能存在的奇字节访问。 |
-xmemalign=2i |
要检查可能存在的奇字节访问并要使程序工作。 |