跳转到主要内容

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

当您初次登录到 developerWorks 时,将会为您创建一份概要信息。您在 developerWorks 概要信息中选择公开的信息将公开显示给其他人,但您可以随时修改这些信息的显示状态。您的姓名(除非选择隐藏)和昵称将和您在 developerWorks 发布的内容一同显示。

所有提交的信息确保安全。

  • 关闭 [x]

当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

所有提交的信息确保安全。

  • 关闭 [x]

移植 UNIX 应用到 IBM i PASE

应锦鑫, 软件工程师, IBM
应锦鑫是 2006 年加入 IBM 中国系统科技实验室的软件工程师,主要从事 IBM i 上 CIM Provider 的开发及 OpenPegasus 在 IBM i 上的移植工作。您可以访问他在 developerWorks 社区中的概要信息
赵新峰, 软件工程师, IBM
赵新峰是 2008 年加入 IBM 中国系统科技实验室的软件工程师,主要从事 CIM Server for IBM i 项目的开发工作。所感兴趣和专长的领域包括 CIM 架构,CIM Server 和 IBM i License Program 安装和退出程序的开发。
刘立功, 软件工程师, IBM
刘立功是 2010 年加入 IBM 中国系统科技实验室的软件工程师,当前从事 IBM i 上 CIM产品的研发,此外他还对 DMTF 标准化组织工作非常感兴趣。

简介: IBM i 提供了一个集成的类 UNIX 的运行时环境——PASE(Portable Application Solution Environment),使得我们只要对 UNIX 应用程序做很少甚至不修改就能够在 IBM i 上运行,从而有效地扩大了 IBM i 平台解决方案的组合,节省开发成本。本文主要介绍了如何移植一个 UNIX 应用到 IBM i PASE 环境,其中包括如何搭建 PASE 开发环境,应用的移植及调试。

发布日期: 2011 年 8 月 24 日
级别: 中级
访问情况 : 1094 次浏览
评论: 


PASE 简介

IBM i PASE(Portable Application Solution Environment)提供了一个集成的类 UNIX 的运行时环境,使得我们只要对 UNIX/Linux 应用程序做很少甚至不修改就能够在 IBM i 上运行。PASE 同时提供了工业标准的及事实标准的 Shell 及工具,从而给我们提供了一个强大的脚本平台。IBM i PASE 系统架构如图 1 所示:


图 1. IBM i PASE 系统架构
IBM i PASE 系统架构

从中可以看出,PASE 环境不像 IBM i 原生环境下的应用程序,IBM i 原生环境下的应用程序通过 MI 层实现了硬件无关的特性。而 PASE 会跟底层的硬件有直接的交互,这使得 PASE 应用跟其它的 UNIX/Linux 应用一样具有硬件依赖性;即当硬件升级时,需要重新编译程序才能与新硬件兼容或者发挥新硬件的新特性。

移植UNIX应用到 IBM i PASE 带来的好处有:

  • 利用现有的技能:

    对于应用的开发者来说,他们可以继续使用他们已有的 UNIX 经验,并且只要掌握很少的 IBM i 技能;对于 IBM i 的客户来说他们只要运行移植到 PASE 下的应用,而不需要额外的 UNIX 系统;

  • 缩短产品推向市场的时间:

    如果要把一个 UNIX 产品一直到 IBM i 的原生环境下,那么将消耗极大的时间和人力。因为 IBM i 系统与 UNIX 系统有着截然不同的系统架构。而移植一个 UNIX 应用到 PASE,在大多数情况下我们只要做少量的修改甚至不修改就可以运行在 PASE 下,从而极大的减少了开发成本,加快产品推向市场的时间。


PASE 开发环境的搭建

以下具体介绍如何在 IBM i 上搭建 PASE 的开发环境。

1. 系统需求

在 IBM i 上运行 PASE 首先要满足下面的系统需求。

  • 许可程序 SS1, option 33 - IBM i End of change Portable Application Solutions Environment (IBM i PASE);
  • 许可程序 SC1, option 1 - OpenSSH, OpenSSL, zlib functions, IBM Portable Utilities for i。

其中“SC1, Option 1”是可选的,如果安装了该许可程序,那么我们可以通过 SSH 连接到 PASE 环境里,使得操作方式更像 UNIX 系统。

2. 安装 RPM 软件包管理器

您可以利用 RPM 软件包管理器来管理 PASE 下的开源的 AIX 软件。以下介绍如何在 PASE 上安装 RPM:

  1. 在 /QOpenSys 下创建一个子目录, 这里将其命名为 rpm_inst;
  2. 下载ftp://ftp.software.ibm.com/aix/freeSoftware/aixtoolbox/INSTALLP/ppc/rpm.rte到刚才创建的目录/QOpenSys/rpm_inst中;
  3. 执行清单 1 中的命令:

清单 1. 安装 RPM
        
cd /QOpenSys/rpm_inst
restore -xqf rpm.rte
mv /QOpenSys/rpm_inst/usr/opt /QOpenSys/
mv /QOpenSys/rpm_inst/var/lib /QOpenSys/var
mv /QOpenSys/rpm_inst/var/opt /QOpenSys/var
mkdir /opt
ln -s /QOpenSys/opt/freeware /opt/freeware
ln -s /QOpenSys/var/opt /var/opt
cd /opt/freeware/lib
mv librpmbuild.so.0.0.0 librpmbuild.so
mv librpm.so.0.0.0 librpm.so
mv libpopt.so.0.0.0 libpopt.so
cd /QOpenSys
rm -rf rpm_inst

注:忽略出现的所有告警信息。

3. 利用 RPM 软件包管理器安装开源的 UNIX 工具

从 http://www-03.ibm.com/systems/p/os/aix/linux/toolbox/download.htm 下载所需工具的安装包。然后用 RPM 安装到 PASE。下面以 gmake 为例示范 RPM 安装,参见清单 2:


清单 2. 用 RPM 安装 gmake
        
rpm --ignoreos --ignorearch --nodeps -i -v make-3.80-1.aix5.1.ppc.rpm

注:忽略出现的所有告警信息。

绝大多数的 AIX 工具都能在 PASE 上运行,如 bash、gcc、vim、bash、gzip、gtar 等等。

4. 在 PASE 上安装 IBM XL C/C++ for AIX

  1. 将编译器产品安装 CD 插入 CD 驱动器;
  2. 使用具有 *ALLOBJ 权限的用户登陆系统;
  3. 在 PASE 下执行清单 3 中的命令来恢复相应的编译器安装脚本:

清单 3. 用 RPM 安装 gmake
        
cd /
restore -qf /QOPT/CDROM/USR/SYS/INST.IMA/VACPP.NDI ./usr/vacpp/bin/vacppndi

  1. 运行清单 4 中的安装脚本以安装编译器。编译器的目标目录由命令 -b 选项指定:

清单 4. 用 RPM 安装 gmake
                
/QIBM/ProdData/DeveloperTools/pase/bin/perl /usr/vacpp/bin/vacppndi -i –d \ /QOPT
/CDROM/USR/SYS/INST.IMA -b /QOpenSys/xlcpp

安装后可在 /QOpenSys/xlcpp/usr/vacpp/bin/ 中找到 XL C/C++ 编译命令(例如, xlc)。可以将个目录添加到系统路径中:export $PATH=$PATH:/QOpenSys/xlcpp/usr/vacpp/bin。

至此 PASE 的开发环境已经搭建完毕,我们可以开始进行 UNIX 应用的移植工作了。


移植 UNIX 应用到 PASE

1. 项目的配置

UNIX/Linux 应用通常用 Autoconfig 进行配置,下面我们讲解如何进行项目的配置。

方法一:如果项目配置允许指定平台信息,那么我们可以用 AIX 平台的配置来配置 PASE 项目。通常 configure 允许用 --build 来指定 build 系统的信息,我们可以将其指定为 powerpc-ibm-aix,表示将在 AIX 系统中进行编译。清单 5 以 ICU 为例:


清单 5. 项目配置
        
export CC=xlc_r
export CXX=xlC_r
./configure --build=powerpc-ibm-aix --enable-debug=yes --prefix=/QOpenSys/
QIBM/ProdData/ICU/icu-4.0

方法二:在AIX系统中进行项目配置,配置完成后再将工程文件拷回到IBM i PASE下进行编译调试。配置完工程后我们就可以运行gmake命令来编译工程了。

2. 调用 ILE 下的 API

有时 PASE 下不支持某些 UNIX 下的 API 或者产品需要和 IBM i 的某些特性集成,需要调用 ILE 下的 API 来实现。PASE 提供了调用 ILE PGM/SVRPGM 接口。

当从 PASE 下调用 ILE PGM/SRVPGM 接口时,我们应该:

  • 确保 ILE 端程序支持 teraspace:所有支持从 PASE 下调用的 ILE PGM/SRVPGM 在编译时必须将 teraspace 选项设成 *YES,否则会导致 PASE 调用时产生 MCH4433(无效存储模式)错误。
  • 相关的头文件:当需要从 PASE 调用 ILE API 时,应当包含 as400_types.h 和 as400_protos.h 这两个头文件。 这两个头文件包含了一些 IBM i 系统独特数据类型及函数的定义。
  • 调用 ILE API:首先用 _ILELOAD 或 ILELOADX() 函数将 API 所在的对象加载到内存中,再用 _ILESYM() 或 _ILESYMX() 函数找到 ILE API 的程序入口,最后用 ILECALL() 或 _ILECALLX() 来调用函数。
  • CCSID 编码转换:通常 ILE PGM/SRVPGM 接口返回的是 EBCDIC 编码字符,PASE 程序用的是 ASCII 或 UNICODE 编码。在使用这些 ILE API 返回的字符串前必须经过适当的转换。

示例代码如清单 6 所示:


清单 6. 调用 ILE API
		
#include <as400_types.h>
#include <as400_protos.h>
……
/*ILE API _Ropen procedure wrapper*/
ILEpointer _Ropen(const char * filename, const char * mode, ...)
{
    va_list argList;
    va_start(argList, mode);
/* pointer to ILE procedure */
        ILEpointer ILEtarget __attribute__((__aligned__(16)));
	 ILEarglist_base *ILEarglist;
        ILEpointer rtnILEpointer __attribute__((__aligned__(16)));
        char parms[48] = {0};
    short signature[] =
    {
        ARG_MEMPTR,
        ARG_MEMPTR,
        ARG_MEMPTR,
        PARM_END
        };
        _SETSPP(&rtnILEpointer,NULL);
        ……
      /* _ILELOADX() loads the service program */
      actmark = _ILELOADX("QSYS/QC2IO", ILELOAD_LIBOBJ);
      rc = _ILESYMX(&ILEtarget, actmark, "_Ropen");
    
    memcpy(&parms[0], filename,sizeof(filename));
    memcpy(&parms[16], mode,sizeof(mode));
    memcpy(&parms[32], argList,sizeof(argList));
    ILEarglist = (ILEarglist_base*)malloc( size_ILEarglist(signature));
     
     /* 
* Build the argument list into an ILE arg list buffer 
* adhering to the signature provided 
*/
    build_ILEarglist(ILEarglist, parms, signature);
     
     
    /*
     * _ILECALL calls the ILE procedure. If an exception or signal
     * occurs, the heap allocation is orphaned (storage leak)
     */
    rc = _ILECALL(ILEtarget, ILEarglist, signature, RESULT_VOID);
    _MEMCPY_WT(&rtnILEpointer, & ILEarglist->result.r_aggregate, sizeof(ILEpointer));
    return rtnILEpointer;
}

调用 ILE PGM/SRVPGM 时的注意事项:

  • 当从 PASE 端调用 ILE PGM/SRVPGM 时,Activation group 需要被调用的程序具有 *CALLER 编译选项,这是因为:
    • 只有运行在 activation group 的代码才能使用 ILE 端的 API,例如 Qp2CallPase,从而与 PASE 端的程序进行交互;
    • 对于具有多线程的进程,如果在线程中被调用的 ILE 端程序需要销毁 activation group 的时候,即使 PASE 端所起的所有的进程是线程安全的,ILE 端也可能结束整个进程(包括 PASE 端程序)。 这个时候你可以使用 ACTGRP(*CALLER) 来阻止你的进程被结束;
  • 避免上述多线程所带来的问题,可以使用 systemCL() 来在一个独立的进程里运行一个 IBM i CL 命令(包括CALL)。

具体详细信息请参照参考资源中的“从 IBM PASE for i 调用 IBM i 应用程序或过程”。

3. 程序的调试

IBM i PASE 提供了基于命令行的 dbx 调试器及基于 GUI 的 System i5 调试器。关于 dbx 请参考 dbx 手册或在线帮助。

System i5 调试器是基于 Java 技术的远程调试工具,能运行于所有支持 Java GUI 的系统中。System i5 调试器要求运行于 Java 1.4 或以上版本,并要求系统有 Javahelp 的 jhall.jar。System i5 调试器的 jar 包(jt400.jar 和 tes.jar)可以从 IBM i 服务器的目录 /QIBM/ProdData/HTTP/Public/jt400/lib/ 复制到调试客户机上,并把以上的 jar 包加到 CLASSPATH 的环境变量中。

在使用 System i5 调试器前必须确保被调试的目标系统中调试服务是启动的,如果未启动,请用 STRTCPSVR *DBG 命令启动。

接着可以用以下命令启动调试管理器:java utilities.DebugMgr。启动后的管理器界面如图 2 所示:


图 2. 调试管理器
调试管理器

点击开始按钮开始 PASE 程序的调试。


图 3. 开始调试
开始调试

System i5 调试器允许我们提交新的程序或者调试已经运行的程序,选定后就可以启动 PASE 的调试器了。PASE 的调试器非常简单易用,这里就不详细介绍了。


图 4. PASE 调试器
PASE 调试器

关于 System i5 调试器的安装及运行请阅读参考资源中的“System i 5 调试器”。


结束语

IBM i PASE 环境提供了一个集成的类 UNIX 的运行时环境,使得我们只要对 UNIX 应用程序做很少甚至不修改就能够在 IBM i 上运行,从而有效地扩大了 IBM i 平台解决方案的组合,节省开发成本,加快了企业在 IBM i 平台上对应产品推出速度。


参考资料

学习

获得产品和技术

作者简介

应锦鑫是 2006 年加入 IBM 中国系统科技实验室的软件工程师,主要从事 IBM i 上 CIM Provider 的开发及 OpenPegasus 在 IBM i 上的移植工作。您可以访问他在 developerWorks 社区中的概要信息

赵新峰是 2008 年加入 IBM 中国系统科技实验室的软件工程师,主要从事 CIM Server for IBM i 项目的开发工作。所感兴趣和专长的领域包括 CIM 架构,CIM Server 和 IBM i License Program 安装和退出程序的开发。

刘立功是 2010 年加入 IBM 中国系统科技实验室的软件工程师,当前从事 IBM i 上 CIM产品的研发,此外他还对 DMTF 标准化组织工作非常感兴趣。

关于报告滥用的帮助

报告滥用

谢谢! 此内容已经标识给管理员注意。


关于报告滥用的帮助

报告滥用

报告滥用提交失败。 请稍后重试。


developerWorks:登录


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 使用条款

 


当您初次登录到 developerWorks 时,将会为您创建一份概要信息。您在 developerWorks 概要信息中选择公开的信息将公开显示给其他人,但您可以随时修改这些信息的显示状态。您的姓名(除非选择隐藏)和昵称将和您在 developerWorks 发布的内容一同显示。

请选择您的昵称:

当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

(长度在 3 至 31 个字符之间)


单击提交则表示您同意developerWorks 的条款和条件。 使用条款.

 


为本文评分

评论

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=IBM i, AIX and UNIX
ArticleID=751535
ArticleTitle=移植 UNIX 应用到 IBM i PASE
publish-date=08242011
author1-email=yingjx@cn.ibm.com
author1-email-cc=
author2-email=zhaoxinf@cn.ibm.com
author2-email-cc=
author3-email=llgliu@cn.ibm.com
author3-email-cc=

标签

Help
使用 搜索 文本框在 My developerWorks 中查找包含该标签的所有内容。

使用 滑动条 调节标签的数量。

热门标签 显示了特定专区最受欢迎的标签(例如 Java technology,Linux,WebSphere)。

我的标签 显示了特定专区您标记的标签(例如 Java technology,Linux,WebSphere)。

使用搜索文本框在 My developerWorks 中查找包含该标签的所有内容。热门标签 显示了特定专区最受欢迎的标签(例如 Java technology,Linux,WebSphere)。我的标签 显示了特定专区您标记的标签(例如 Java technology,Linux,WebSphere)。