级别: 初级
Chakarat Skawratananond, Linux on POWER 技术顾问, IBM
Sean Perry, 高级开发人员, IBM
Matt Davis, 顾问, Freelance
2005 年 2 月 15 日
更新 2009 年 10 月 19 日
遵循这个分为六步的指南可以加速移植速度。了解移植过程中通常会遇到的 Solaris 与 Linux® on POWER® 之间的差别。介绍在基于 IBM POWER 处理器的系统上运行的 Linux 开发环境,查看 SUN 的编译器/连接程序开关与 GNU GCC 和 IBM 原始编译器的开关之间的比较。最后,了解用于性能分析的工具和 Linux on POWER 的软件包。[本文根据最新产品版本进行了更新 —— 编辑。]
通常,将基于 Solaris 的应用程序移植到 Linux 是一项简单的任务,因为 Solaris 和 Linux 都是基于 UNIX® 的。要实现这个移植,通常只需在一些编译器和连接程序开关中通过较小的更改实现重新编译即可。只有当应用程序依靠于系统特定实现时,才需要对它们进行较大改动。虽然 Solaris 和 Linux 都设计为遵循标准,但是它们的实现中有时会出现差别。本指南将着重讲述这些差别,并在 Linux 端没有对等项时,提供可能的解决方案。
本文的内容组织如下:
- 迁移路线图
- 迁移事项,包括字节排列顺序以及 32 位和 64 位移植问题
- Linux on POWER 的开发环境
- Solaris 与 Linux 之间的差别
- 可用于 Linux on POWER 的性能调优工具和软件打包工具
我们将重点介绍将运行于 32 位或 64 位 SPARC、Intel® 或 AMD x86 架构之上的 Solaris 迁移到运行于 POWER 架构之上的 Linux。对于 Solaris,我们的讨论将基于版本 9 及其更高版本。对于 Linux,我们将重点讨论基于 IBM POWER 处理器的服务器中的可用发行版本:SUSE LINUX Enterprise Server (SLES) 版本 11 和版本 10 SP 2 和 Red Hat Enterprise Linux (RHEL) 版本 5 更新 2。
您需要了解源平台与目标平台之间的差别。例如,需要知道源平台上的字节排列顺序是否与目标平台上的字节排列顺序有所不同。如果源平台是 Solaris/x86,则您应该考虑字节排列顺序,因为 Linux on POWER 是大端字节的,而 Solaris/x86 是小端字节的。
还要确定目标平台上是否包含所有必需的第三方包(比如数据库和类库)。对于 32 位应用程序,要考虑是否有必要迁移到 64 位。在下面的 一般迁移事项 小节中,将提供字节排列顺序以及 32 位到 64 位问题的信息。
此外,要决定哪个编译器用于目标平台。如果应用程序是性能敏感的,那么还要考虑使用原始编译器。在 Linux on POWER 的开发环境 小节中,将提供关于 Linux on POWER 的可用编译器的详细信息。
这一步中包括设置开发环境、设置环境变量、对 makefile 进行更改,等等。在结束这个阶段时,应该可以开始构建应用程序了。
这一步中包括修复编译器错误、连接程序错误和其他信息。代码经常要多次重复执行步骤 2 和步骤 3 才能生成没有问题的构建。
成功构建应用程序后,还要对其进行测试,检查运行时错误。
现在,移植的代码已经可以在目标平台上运行。可以通过监控性能来确保移植的代码按照预期的那样执行。如果没有按照预期的那样执行,必须进行性能调优。在本文的 性能调优 小节中,将提供关于可用于 Linux on POWER 的性能调优工具的详细信息。
您是否要将得到的代码传送给其他人?如果要传送,您想使用哪种打包方法?Linux 提供了多种方法来打包应用程序,比如自安装外壳脚本或 RPM。软件打包 小节中将提供关于 Linux 的软件打包的详细信息。
这一节将提供何时将应用程序从 32 位迁移到 64 位的信息,以及跨越字节排列顺序障碍的应用程序要考虑的一些问题。从 Solaris on x86 平台上迁移的应用程序将跨越字节排列顺序障碍。熟悉 32 位到 64 位迁移和字节顺序的开发人员可以跳到下一小节 “Linux on POWER 的开发环境”。
一旦决定移植到 Linux on POWER,如果应用程序目前是 32 位的,那么还要考虑将应用程序移植到 64 位。不过,不需要 64 位功能的 32 位应用程序应该保持 32 位。涉及迁移到 64 位的任何移植工作都应该分为两步:
- 首先,以 32 位形式迁移到目标平台。
- 然后才能迁移到 64 位。
否则,因为平台迁移导致的问题很容易与因为迁移到 64 位导致的问题混淆。也就是说,如果应用程序可以满足下列条件,则应该移植到 64 位:
- 受益于大于 4GB 的虚拟地址空间。
- 受益于更多的物理内存(大于 4GB),同时用户可能在拥有大于 4GB 的物理内存的系统中进行部署。
- 受益于 64 位整数大小。
- 受益于完整 64 位寄存器,以便进行有效的 64 位运算。
- 使用大于 2GB 的文件。
应用程序可以保持 32 位,同时仍旧在 64 位 Linux on POWER 内核中运行,而无需进行任何代码更改。基于 POWER 处理器的 IBM Linux 服务器支持 32 位和 64 位应用程序同时在 64 位架构中运行,而在这两种模式之间不会有任何性能下降。
将 32 位应用程序转换为 64 位应用程序时,可能会出现两个基本问题:数据类型不一致 和使用不同数据模型的应用程序之间的互操作。
64 位环境使用与 32 位环境不同的数据类型模型。对于 Linux on POWER,ILP 32 模型用于 32 位环境中,而 LP64 用于 64 位环境中。这两种模型之间的区别在于长整型 和指针 的大小。因此,当应用程序从 ILP32 转换为 LP64 时,数据类型中会发生基本变化。长整型和整型的大小不再相同。指针和整型的大小也不再相同。如果对象(如 struct 和 union)包含指针或长整型数据类型,那么它们的大小在 64 位环境中会比较大。通常,由这些差别引起的其他问题有:
- 数据截断
- 指针赋值
- 数据对齐
- 数据共享
IBM XL 编译器提供 -qwarn64 选项帮助检查 32 位和 64 位模式之间可能出现的数据转换问题。
将应用程序从 32 位迁移到 64 位环境的主题在其他文章中已经进行了大量讲述。因此本文中我们将不再详细说明如何处理这些移植问题。(请参阅 “将 Linux 应用程序移植到 64 位系统” 了解更多信息)。
因为 SPARC 和 POWER 架构都是大字节端的,所以在这些平台之间移植应用程序时,不会存在字符排列顺序问题。然而,如果将 Solaris on x86 应用程序移植到 Linux on POWER,可能需要处理字节排列顺序可移植性问题,因为 x86 是小字节端架构。
在将应用程序从一种架构类型迁移至另一种架构类型的过程中,经常会遇到字节排列顺序(endianness)问题。字节排列顺序 是数据元素及其单个字节在内存中存储和表示时的顺序。有两类字节排列顺序:大端字节 和小端字节。
对于大端字节处理器,比如 POWER、PowerPC™ 和 SPARC,在将字放在内存中时,是从最低位地址开始的,首先放入最有效的字节。另一方面,对于小端字节处理器,比如 Intel 和 Alpha 处理器,首先放入的是最低效的字节。
图 1 显示了大端字节和小端字节处理器如何在其内存中放置十六进制值,比如 0x89ABCDEF:
出现字节排列顺序问题的原因之一是不一致的数据引用。它经常表现为由于数据元素转换、使用联合数据结构或使用和操作位域导致数据类型不匹配。清单 1 说明了因为使用指针进行不一致的数据引用而引起的字节排列顺序问题:
int main() { int value; char *p; p = (char*) &value; value = 0x89ABCDEF; printf("%X.%X.%X.%X\n" p[0], p[1], p[2], p[3]); return 0; } |
这一节将描述 Linux on POWER 开发环境的基础元素,包括发行版、编译器和 Java™ 技术的应用。
有两个一流 Linux 供应商提供了 Linux for POWER 的企业版:SUSE LINUX 和 Red Hat。虽然 Linux 社区非常倚重这两个版本,但是它们不断推出新的版本时,发行版和版本的差异越来越大。大部分开发人员应该能够顺利在这两个产品之一的相同代码基础上部署系统的软件:
- SLES11
于 2009 年初发行,Novell 的 SUSE Linux Enterprise Server 版本 11 提供新的内核改进、虚拟化改进、管理、硬件支持和互操作性。它在数据中心包含用于处理任务关键型工作负载的特性和更新。SUSE Linux Enterprise Server 提供一个开源、可伸缩并且高性能的数据中心解决方案。SLES11 基于 2.6.27 内核并提供 GCC 4.3.2、glibc 2.9 和 binutils 2.19。 - SLES10 SP2
SUSE Linux Enterprise Server 版本 10 Service Pack 2 基于 Linux 2.6.16 内核并支持 Linux on POWER 硬件的所有企业特性。该开发环境提供 GCC 4.1.2、glibc 2.4.31 和 GNU binutils 2.16.91。 - RHEL5.3
时间:2009-10-19 21:24 来源:developworks 作者:developworks 原文链接