PASE 簡介
IBM i PASE(Portable Application Solution Environment)提供了一個集成的類 UNIX 的運行時環(huán)境,使得我們只要對 UNIX/Linux 應用程序做很少甚至不修改就能夠在 IBM i 上運行。PASE 同時提供了工業(yè)標準的及事實標準的 Shell 及工具,從而給我們提供了一個強大的腳本平臺。IBM i PASE 系統(tǒng)架構如圖 1 所示:
圖 1. IBM i PASE 系統(tǒng)架構
從中可以看出,PASE 環(huán)境不像 IBM i 原生環(huán)境下的應用程序,IBM i 原生環(huán)境下的應用程序通過 MI 層實現(xiàn)了硬件無關的特性。而 PASE 會跟底層的硬件有直接的交互,這使得 PASE 應用跟其它的 UNIX/Linux 應用一樣具有硬件依賴性;即當硬件升級時,需要重新編譯程序才能與新硬件兼容或者發(fā)揮新硬件的新特性。
移植UNIX應用到 IBM i PASE 帶來的好處有:
利用現(xiàn)有的技能:
對于應用的開發(fā)者來說,他們可以繼續(xù)使用他們已有的 UNIX 經(jīng)驗,并且只要掌握很少的 IBM i 技能;對于 IBM i 的客戶來說他們只要運行移植到 PASE 下的應用,而不需要額外的 UNIX 系統(tǒng);
縮短產(chǎn)品推向市場的時間:
如果要把一個 UNIX 產(chǎn)品一直到 IBM i 的原生環(huán)境下,那么將消耗極大的時間和人力。因為 IBM i 系統(tǒng)與 UNIX 系統(tǒng)有著截然不同的系統(tǒng)架構。而移植一個 UNIX 應用到 PASE,在大多數(shù)情況下我們只要做少量的修改甚至不修改就可以運行在 PASE 下,從而極大的減少了開發(fā)成本,加快產(chǎn)品推向市場的時間。
PASE 開發(fā)環(huán)境的搭建
以下具體介紹如何在 IBM i 上搭建 PASE 的開發(fā)環(huán)境。
1. 系統(tǒng)需求
在 IBM i 上運行 PASE 首先要滿足下面的系統(tǒng)需求。
- 許可程序 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 環(huán)境里,使得操作方式更像 UNIX 系統(tǒng)。
2. 安裝 RPM 軟件包管理器
您可以利用 RPM 軟件包管理器來管理 PASE 下的開源的 AIX 軟件。以下介紹如何在 PASE 上安裝 RPM:
清單 1. 安裝 RPM
cd /QOpenSys/rpm_instrestore -xqf rpm.rtemv /QOpenSys/rpm_inst/usr/opt /QOpenSys/mv /QOpenSys/rpm_inst/var/lib /QOpenSys/varmv /QOpenSys/rpm_inst/var/opt /QOpenSys/varmkdir /optln -s /QOpenSys/opt/freeware /opt/freewareln -s /QOpenSys/var/opt /var/optcd /opt/freeware/libmv librpmbuild.so.0.0.0 librpmbuild.somv librpm.so.0.0.0 librpm.somv libpopt.so.0.0.0 libpopt.socd /QOpenSysrm -rf rpm_inst |
注:忽略出現(xiàn)的所有告警信息。
3. 利用 RPM 軟件包管理器安裝開源的 UNIX 工具
清單 2. 用 RPM 安裝 gmake
rpm --ignoreos --ignorearch --nodeps -i -v make-3.80-1.aix5.1.ppc.rpm |
注:忽略出現(xiàn)的所有告警信息。
絕大多數(shù)的 AIX 工具都能在 PASE 上運行,如 bash、gcc、vim、bash、gzip、gtar 等等。
4. 在 PASE 上安裝 IBM XL C/C++ for AIX
- 將編譯器產(chǎn)品安裝 CD 插入 CD 驅(qū)動器;
- 使用具有 *ALLOBJ 權限的用戶登陸系統(tǒng);
- 在 PASE 下執(zhí)行清單 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)。可以將個目錄添加到系統(tǒng)路徑中:export $PATH=$PATH:/QOpenSys/xlcpp/usr/vacpp/bin。
至此 PASE 的開發(fā)環(huán)境已經(jīng)搭建完畢,我們可以開始進行 UNIX 應用的移植工作了。
移植 UNIX 應用到 PASE
1. 項目的配置
UNIX/Linux 應用通常用 Autoconfig 進行配置,下面我們講解如何進行項目的配置。
方法一:如果項目配置允許指定平臺信息,那么我們可以用 AIX 平臺的配置來配置 PASE 項目。通常 configure 允許用 --build 來指定 build 系統(tǒng)的信息,我們可以將其指定為 powerpc-ibm-aix,表示將在 AIX 系統(tǒng)中進行編譯。清單 5 以 ICU 為例:
清單 5. 項目配置
export CC=xlc_rexport CXX=xlC_r./configure --build=powerpc-ibm-aix --enable-debug=yes --prefix=/QOpenSys/QIBM/ProdData/ICU/icu-4.0 |
方法二:在AIX系統(tǒng)中進行項目配置,配置完成后再將工程文件拷回到IBM i PASE下進行編譯調(diào)試。配置完工程后我們就可以運行gmake命令來編譯工程了。
2. 調(diào)用 ILE 下的 API
有時 PASE 下不支持某些 UNIX 下的 API 或者產(chǎn)品需要和 IBM i 的某些特性集成,需要調(diào)用 ILE 下的 API 來實現(xiàn)。PASE 提供了調(diào)用 ILE PGM/SVRPGM 接口。
當從 PASE 下調(diào)用 ILE PGM/SRVPGM 接口時,我們應該:
- 確保 ILE 端程序支持 teraspace:所有支持從 PASE 下調(diào)用的 ILE PGM/SRVPGM 在編譯時必須將 teraspace 選項設成 *YES,否則會導致 PASE 調(diào)用時產(chǎn)生 MCH4433(無效存儲模式)錯誤。
- 相關的頭文件:當需要從 PASE 調(diào)用 ILE API 時,應當包含 as400_types.h 和 as400_protos.h 這兩個頭文件。 這兩個頭文件包含了一些 IBM i 系統(tǒng)獨特數(shù)據(jù)類型及函數(shù)的定義。
- 調(diào)用 ILE API:首先用 _ILELOAD 或 ILELOADX() 函數(shù)將 API 所在的對象加載到內(nèi)存中,再用 _ILESYM() 或 _ILESYMX() 函數(shù)找到 ILE API 的程序入口,最后用 ILECALL() 或 _ILECALLX() 來調(diào)用函數(shù)。
- CCSID 編碼轉(zhuǎn)換:通常 ILE PGM/SRVPGM 接口返回的是 EBCDIC 編碼字符,PASE 程序用的是 ASCII 或 UNICODE 編碼。在使用這些 ILE API 返回的字符串前必須經(jīng)過適當?shù)霓D(zhuǎn)換。
示例代碼如清單 6 所示:
清單 6. 調(diào)用 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;} |
調(diào)用 ILE PGM/SRVPGM 時的注意事項:
- 當從 PASE 端調(diào)用 ILE PGM/SRVPGM 時,Activation group 需要被調(diào)用的程序具有 *CALLER 編譯選項,這是因為:
- 只有運行在 activation group 的代碼才能使用 ILE 端的 API,例如 Qp2CallPase,從而與 PASE 端的程序進行交互;
- 對于具有多線程的進程,如果在線程中被調(diào)用的 ILE 端程序需要銷毀 activation group 的時候,即使 PASE 端所起的所有的進程是線程安全的,ILE 端也可能結(jié)束整個進程(包括 PASE 端程序)。 這個時候你可以使用 ACTGRP(*CALLER) 來阻止你的進程被結(jié)束;
- 避免上述多線程所帶來的問題,可以使用 systemCL() 來在一個獨立的進程里運行一個 IBM i CL 命令(包括CALL)。
3. 程序的調(diào)試
IBM i PASE 提供了基于命令行的 dbx 調(diào)試器及基于 GUI 的 System i5 調(diào)試器。關于 dbx 請參考 dbx 手冊或在線幫助。
System i5 調(diào)試器是基于 Java 技術的遠程調(diào)試工具,能運行于所有支持 Java GUI 的系統(tǒng)中。System i5 調(diào)試器要求運行于 Java 1.4 或以上版本,并要求系統(tǒng)有 Javahelp 的 jhall.jar。System i5 調(diào)試器的 jar 包(jt400.jar 和 tes.jar)可以從 IBM i 服務器的目錄 /QIBM/ProdData/HTTP/Public/jt400/lib/ 復制到調(diào)試客戶機上,并把以上的 jar 包加到 CLASSPATH 的環(huán)境變量中。
在使用 System i5 調(diào)試器前必須確保被調(diào)試的目標系統(tǒng)中調(diào)試服務是啟動的,如果未啟動,請用 STRTCPSVR *DBG 命令啟動。
接著可以用以下命令啟動調(diào)試管理器:java utilities.DebugMgr。啟動后的管理器界面如圖 2 所示:
圖 2. 調(diào)試管理器
點擊開始按鈕開始 PASE 程序的調(diào)試。
圖 3. 開始調(diào)試
System i5 調(diào)試器允許我們提交新的程序或者調(diào)試已經(jīng)運行的程序,選定后就可以啟動 PASE 的調(diào)試器了。PASE 的調(diào)試器非常簡單易用,這里就不詳細介紹了。
圖 4. PASE 調(diào)試器
結(jié)束語
IBM i PASE 環(huán)境提供了一個集成的類 UNIX 的運行時環(huán)境,使得我們只要對 UNIX 應用程序做很少甚至不修改就能夠在 IBM i 上運行,從而有效地擴大了 IBM i 平臺解決方案的組合,節(jié)省開發(fā)成本,加快了企業(yè)在 IBM i 平臺上對應產(chǎn)品推出速度。