IBM i PASE(Portable Application Solution Environment)提供了一个集成的类 UNIX 的运行时环境,使得我们只要对 UNIX/Linux 应用程序做很少甚至不修改就能够在 IBM i 上运行。PASE 同时提供了工业标准的及事实标准的 Shell 及工具,从而给我们提供了一个强大的脚本平台。IBM i PASE 系统架构如图 1 所示:
图 1. 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 下,从而极大的减少了开发成本,加快产品推向市场的时间。
以下具体介绍如何在 IBM i 上搭建 PASE 的开发环境。
在 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 系统。
您可以利用 RPM 软件包管理器来管理 PASE 下的开源的 AIX 软件。以下介绍如何在 PASE 上安装 RPM:
- 在 /QOpenSys 下创建一个子目录, 这里将其命名为 rpm_inst;
- 下载ftp://ftp.software.ibm.com/aix/freeSoftware/aixtoolbox/INSTALLP/ppc/rpm.rte到刚才创建的目录/QOpenSys/rpm_inst中;
- 执行清单 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 |
注:忽略出现的所有告警信息。
从 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
- 将编译器产品安装 CD 插入 CD 驱动器;
- 使用具有 *ALLOBJ 权限的用户登陆系统;
- 在 PASE 下执行清单 3 中的命令来恢复相应的编译器安装脚本:
清单 3. 用 RPM 安装 gmake
cd /
restore -qf /QOPT/CDROM/USR/SYS/INST.IMA/VACPP.NDI ./usr/vacpp/bin/vacppndi |
- 运行清单 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/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命令来编译工程了。
有时 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 应用程序或过程”。
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 调试器
关于 System i5 调试器的安装及运行请阅读参考资源中的“System i 5 调试器”。
IBM i PASE 环境提供了一个集成的类 UNIX 的运行时环境,使得我们只要对 UNIX 应用程序做很少甚至不修改就能够在 IBM i 上运行,从而有效地扩大了 IBM i 平台解决方案的组合,节省开发成本,加快了企业在 IBM i 平台上对应产品推出速度。
学习
- “从 IBM PASE for i 调用 IBM i 应用程序或过程”:IBM i 7.1 信息中心中关于程序调用的章节。
- “ System i5 调试器”:IBM i 7.1 信息中心中关于调试的章节。
- “IBM i 7.1 信息中心”:关于 IBM i 7.1 的技术信息中心。
-
"developerWorks 中国网站 IBM i 专区":提供给 IBM i 用户和开发者的专业技术资源。
获得产品和技术
- 获得 IBM i 相关的
产品和工具下载信息,或者
查看更多 IBM DB2®,Lotus®,Rational®,Tivoli® 或 WebSphere®软件免费下载。
应锦鑫是 2006 年加入 IBM 中国系统科技实验室的软件工程师,主要从事 IBM i 上 CIM Provider 的开发及 OpenPegasus 在 IBM i 上的移植工作。您可以访问他在 developerWorks 社区中的概要信息。