Solaris(64 位)开发者指南

第 3 章 比较 32 位接口和 64 位接口

正如突破 4 GB 限制中所讨论的那样,大多数 32 位应用程序将在 Solaris 64 位操作环境中照常运行。一些应用程序可能只需重新编译为 64 位应用程序,其他应用程序则需要进行转换。本章所面向的开发者应根据突破 4 GB 限制中所讨论的各项,确定其应用程序是需要重新编译还是转换成 64 位。

应用编程接口

64 位操作环境中支持的 32 位应用编程接口 (application programming interface, API) 与 32 位操作环境中支持的 API 相同。因此,对于 32 位应用程序,无需在 32 位环境和 64 位环境之间进行更改。但是,重新编译为 64 位应用程序可能需要执行清理操作。有关如何清理代码以实现 64 位应用程序的指导说明,请参见第 4 章,转换应用程序中所定义的规则。

缺省的 64 位API 基本属于 UNIX 98 系列的 API,其规范是使用派生类型的术语编写的。通过将某些派生类型扩展到 64 位值可获取 64 位版本。使用这些 API 的正确编写的应用程序可以在 32 位环境和 64 位环境之间以源代码形式进行移植。Solaris 10 中也提供了 UNIX 2001 API 系列,请参见 standards(5)。

应用程序二进制接口

SPARC V8 ABI 是现有的特定于处理器的应用程序二进制接口 (Application Binary Interface, ABI),32 位 SPARC 版本的 Solaris 实现以该接口为基础。SPARC V9 ABI 对 SPARC V8 ABI 进行了扩展,使其可支持 64 位操作,并为此扩展的体系结构定义了新功能。有关其他信息,请参见SPARC V9 ABI 特征

i386 ABI 是特定于处理器的 ABI,32 位版本的 Solaris (Intel Platform Edition) 以该接口为基础。

对于 Solaris 10 发行版,amd64 ABI 是特定于处理器的 ABI,x86 系统中 64 位版本的 Solaris 以该接口为基础。amd64 ABI 支持 64 位操作并为新体系结构定义了新功能。使用 64 位 ABI 的程序的性能可能会优于对应的 32 位程序。支持 amd64 ABI 的处理器也支持 i386 ABI。有关其他信息,请参见AMD64 ABI 特征

32 位应用程序和 64 位应用程序之间的兼容性

以下几节将讨论 32 位应用程序和 64 位应用程序之间不同级别的兼容性。

应用程序二进制对象

现有的 32 位应用程序可以在 32 位或 64 位操作环境中运行,仅有那些使用 libkvm/dev/mem/dev/kmem/proc 的应用程序例外。有关更多信息,请参见突破 4 GB 限制

应用程序源代码

对于 32 位应用程序保留了源代码级别的兼容性。对于 64 位应用程序,进行的主要更改与应用编程接口中所使用的派生类型有关。正确使用派生类型和接口的应用程序,其源代码对于 32 位是兼容的,并且更便于转换到 64 位。

设备驱动程序

由于 32 位设备驱动程序无法用于 64 位操作系统中,因此这些驱动程序必须重新编译为 64 位对象。此外,64 位驱动程序还需要同时支持 32 位应用程序和 64 位应用程序。64 位操作环境附带的所有驱动程序均可同时支持 32 位应用程序和 64 位应用程序。但是,DDI(设备驱动程序接口)支持的基础驱动程序模型和接口没有发生变化。主要工作是清理要在 LP64 环境中进行更正的代码。有关更多信息,请参见《编写设备驱动程序》手册。

运行的是哪种 Solaris 操作环境?

Solaris 操作环境可以同时支持两个一流的 ABI。换句话说,两个完全正常工作的独立系统调用路径可连接到 64 位内核中,这两组库均支持应用程序。

64 位操作系统只能在 64 位 CPU 硬件上运行,而 32 位版本则可以在 32 位 CPU 硬件上或 64 位 CPU 硬件上运行。由于 Solaris 32 位和 64 位操作环境看上去非常相似,因此可能不易分辨特定硬件平台上运行的是哪个版本的操作环境。

要确定系统上运行的是哪个版本的操作环境,最容易的方法就是使用 isainfo 命令。此新命令可以列显有关系统上所支持的应用程序环境的信息。

以下举例说明了在运行 64 位操作系统的 UltraSPARC 系统中执行的 isainfo 命令:


% isainfo -v

64-bit sparcv9 applications

32-bit sparc applications  

以下是在运行 32 位 Solaris 操作系统的 x86 系统中执行的 isainfo 命令:


% isainfo -v

32-bit i386 applications

以下是在运行 64 位 Solaris 操作系统的 x86 系统上执行的 isainfo 命令:


% isainfo -v

64-bit amd64 applications

32-bit i386 applications

注 –

并非所有 x86 系统都能够运行 64 位内核。在这种情况下,如果系统运行的是 Solaris 操作环境,则内核会在 32 位模式下运行。


-nisainfo(1) 命令的一个有用选项,用来列显所运行的平台的本机指令集:


% isainfo -n

sparcv9

-b 选项用来列显对应本机应用程序环境的地址空间中的位数:


% echo "Welcome to "`isainfo -b`"-bit Solaris"

Welcome to 64-bit Solaris

必须在早期版本的 Solaris 操作环境中运行的应用程序可以确定 64 位功能是否可用,方法是检查 uname(1) 的输出或检查 /usr/bin/isainfo 是否存在。

isalist(1)isainfo 的相关命令,它更适合在 shell 脚本中使用。isalist 可用来列显平台所支持的指令集的完整列表。但是,随着指令集扩展数量的增加,所有子集的列表的局限性也更加明显。建议用户将来不要依赖此接口。

如果用户要创建依赖指令集扩展的库,则应使用动态链接程序的硬件功能。使用 isainfo 命令可以确定当前平台上的指令集扩展。


% isainfo -x

amd64: sse2 sse fxsr amd_3dnowx amd_3dnow amd_mmx mmx cmov amd_sysc cx8 tsc fpu

i386: sse2 sse fxsr amd_3dnowx amd_3dnow amd_mmx mmx cmov amd_sysc cx8 tsc fpu