Solaris(64 位)开发者指南

SPARC V9 ABI 特征

64 位应用程序使用可执行和链接格式 (Executable and Linking Format, ELF64) 进行描述,使用该格式可以全面地描述大型应用程序和较大地址空间。

SPARC V9。《SPARC Compliance Definition Version 2.4》中包含 SPARC V9 ABI 的详细信息。此文档描述了 32 位 SPARC V8 ABI 和 64 位 SPARC V9 ABI,可以从 SPARC International 公司的网站 www.sparc.com 上获取。

以下列出了 SPARC V9 ABI 的特征:

栈偏移量

SPARC V9。对于开发者来说,SPARC V9 ABI 的一个重要特征就是栈偏移量。 对于 64 位 SPARC 程序来说,必须向帧指针和栈指针中都添加大小为 2047 个字节的栈偏移量,才能达到栈帧的实际数据。 请参见下图。

该图说明如何为 64 位 SPARC 程序添加大小为 2047 个字节的栈偏移量

有关栈偏移量的更多信息,请参见 SPARC V9 ABI。

SPARC V9 ABI 的地址空间布局

SPARC V9。对于 64 位应用程序,尽管起始地址和寻址限制大不相同,但地址空间的布局与 32 位应用程序的布局密切相关。与 SPARC V8 一样,SPARC V9 栈从地址空间的顶部开始减小,而堆则从底部开始扩展数据段。

下图说明了为 64 位应用程序提供的缺省地址空间。地址空间中标记为保留空间的区域可能不是由应用程序进行映射。这些限制在将来的系统中可能会有所放松。

该图说明为典型的 SPARCV9 64 位应用程序分配的地址空间

上图中的实际地址描述了特定计算机上的特定实现,仅供参考。

SPARC V9 ABI 文本和数据的位置

缺省情况下,64 位程序与起始地址 0x100000000 链接,整个程序(包括其文本、数据、堆、栈和共享库)将超过 4 GB。这有助于确保 64 位程序正确无误,方法是使其在截断其任何指针时在较低的 4 GB 地址空间中出错。

尽管 64 位程序会链接到 4 GB 以上的地址空间,但是仍可以通过使用链接程序映射文件以及编译器或链接程序的 -M 选项,将其链接到 4 GB 以下的地址空间。/usr/lib/ld/sparcv9/map.below4G 中提供了一个用来将 64 位 SPARC 程序链接到 4 GB 以下地址空间的链接程序映射文件。

有关更多信息,请参见 ld(1) 链接程序手册页。

SPARC V9 ABI 的代码模型

SPARC V9。编译器针对不同目的提供了不同的代码模型,旨在提高性能并减少 64 位 SPARC 程序中代码的大小。代码模型由以下因素确定:

下表介绍了可用于 64 位 SPARC 程序中的不同代码模型。

表 6–1 代码模型说明:SPARC V9

代码模型 

可放置性 

代码大小 

位置 

外部对象引用模型 

abs32

绝对 

< 2 GB 

低(低 32 位地址空间) 

无 

abs44

绝对 

< 2 GB 

中(低 44 位地址空间) 

无 

abs64

绝对 

< 2 GB 

任意位置 

无 

pic

PIC(位置无关代码) 

< 2 GB 

任意位置 

小(<= 1024 个外部对象) 

PIC

PIC 

< 2 GB 

任意位置 

大(<= 2**29 个外部对象) 

在某些情况下,可以使用较小的代码模型实现较短的指令序列。 在绝对代码中执行静态数据引用所需的指令数在不同的代码模型中各不相同:在 abs32 代码模型中最少,在 abs64 代码模型中最多,在 abs44 代码模型中居于两者之间。 同样,在执行静态数据引用时,pic 代码模型使用的指令比 PIC 代码模型使用的要少。 因此,代码模型越小,代码块越小,对于无需利用较大代码模型的更完整功能的程序,还可能会提高其性能。

要指定要使用的代码模型,应使用 -xcode=<model> 编译器选项。目前,对于 64 位对象,编译器在缺省情况下使用 abs64 模型。 通过使用 abs44 代码模型可以优化代码,此时将使用较少的指令,并且仍能涵盖当前的 UltraSPARC 平台所支持的 44 位地址空间。

有关代码模型的更多信息,请参见 SPARC V9 ABI 和编译器文档。


注 –

对于使用 abs32 代码模型编译的程序,必须使用 -M /usr/lib/ld/sparcv9/map.below4G 选项将其链接到 4 GB 以下的地址空间。