Unix 到 Linux 上的移植方法 (ZT)

Unix 到 Linux 上的移植方法
背景介绍:
随着Linux的普及,很多朋友在做从Unix到Linux的移植。
Unix主要流行的平台主要为Solaris,AIX,HP-Unix和SCO Unix,其中SCO Unix
包括Unixware和Openserver两个平台,在金融和证券行业用的比较多。

谈到移植,没有做过的同事都有点“望而生畏”。其实,通过我给朋友做咨询的经验而讲,
就四个字“知己知彼”。

如果你对要移植的系统和将要移植的目标系统Linux都很熟悉,找出他们的不同点和总结出共同点,
那就没有什么难的了。"Migration Is Easy"


在这个文章中,我给大家讲一些移植的思路和移植方法。最后给大家几个链接,作为大家移植中的
详细参考文献。这里的Linux,适合任何目前主流的发行版。希望能起到抛砖引玉的作用.

文章目录:
SCO Unix与Linux共同点分析
Linux针对软件开发的基石(工具介绍)
SCO Unix到Linux移植的关键因素
SCO Unix到Linux移植策略和方法
SCO Unix到Linux移植规划
重要的参考文献

原创:史应生 shiyingsheng@yahoo.com.cn
1) SCO Unix与RHEL共同点分析
*硬件体系:都是x86架构
*操作系统标准
    SCO Unix 通过了Unix 版权持有者的一致性测试(conformance test)
    Linux的设计是遵循Unix的标准的
所以,在移植中,90%代码不需要修改。如果需要移植的程序使用的是标准的Unix接口集
那么,二进制代码格式相同,这样就不需要移植了

2) Linux针对软件开发的基石(工具介绍),主要是为移植者在Linux开发时,奠定信心。

*开发GUI工具
    KDevelop(C,C++,Script), Eclipse(Java)
*系统调试器
    gdb/KDbg,Frysk,ddd
*性能分析工具(用于在程序运行中,出现问题时,找出程序的瓶颈)
    SystemTap, Oprofile, Gprofile
*软件包管理工具
    RPM,YUM,RHN
*源代码和版本管理工具
    CVS, SubVersion
*系统崩溃或者运行错误分析工具(用于在程序运行中,导致系统崩溃和运行错误时,core dump的分析)
    Kdump,Netdump,Diskdump,Crash

3) SCO Unix到Linux移植的关键因素一
移植中最主要的因素一是:两个平台上使用的开发工具(编译器和连接器)是不同的,那么我们从两者的:
*如何使用?
*命令行构成?
*语言的支持?
三个方面分析。
我们知道:
SCO Unix有自己的C编译器(默认安装),C++编译器并不是默认安装
Linux 的编译器为GCC(GNU Compiler collection ), glibc, libstdc++, 和libgcj实现
Linux 支持C, C++, FORTRAN, Java语言
SCO Unix 对于FORTRAN和JAVA不提供编译器

4) SCO Unix到Linux移植的关键因素(二)
除了编译器和连接器的差异,我们还要考虑:
*两者编程接口是有差异的
*但遵循相同的标准-POSIX.2
*两者有不同的实现方法
*两者有不同的实现状态
*两者有各自的扩展


5) SCO Unix到Linux移植策略

5.1) C编译器特性
如何使用编译器(命令行选项决定了工作模式,优化)?
我们发现两者:相同的C编译器选项 (19项)
       不同的C编译器选项 (40项)
语言扩展特性不同,主要是体现在扩展形式的不同
#pragmas与#define __attribute__(ignore)的对应
两者的内嵌汇编语言不同

5.2) C连接器特性

如何使用编译器(命令行选项决定最终的格式)?
我们发现两者:不同的连接器选项(24项)

6) 对于系统接口(由函数库定义-libc,libm,libpthread)

* 和Unix相比较,Linux只有一小部分函数库和个别函数没有和不同
* SCO Unix是非POSIX线程库,而Linux符合Posix标准ISO 9945-1和9945-2(IEEE1003.1,IEEE1003.2)
* SCO Unix和Linux POSIX线程库的映射表(我们找出有44项映射关系)
* SCO Unix和Linux POSIX信号量库的映射表(我们找出有5项映射关系)
* 网络程序接口
* SCO Unix使用STREAMS和TLI网络接口
* Linux使用POSIX 套接字网络接口
* STREAMS接口(逐渐被淘汰)
* 没有进程共享异步对象(不同进程)
* 互斥体,信号量,条件变量
* 自旋锁
* 线程程序的信号量的处理
* Linux进程和线程对于内核的无差别化

7) 在Linux开发中,要注意环境名字空间问题

干净,与自己定义的标准的兼容
在包含第一个头文件时,设置C预编译宏 (6个宏)

从软件工程的角度,我给出SCO Unix到Linux的移植规划

* 计划和评估
    移植目标(低成本,安全,性能和可靠性等等)
    自己开发的代码的可移植性分析
    相应的第三方应用和中间件的移植分析
    自己开发代码和第三方应用的资源协调
    基于业务的层次的移植还是基于应用的移植
    制定关键的移植里程碑
    移植周期的计划
* 实施
    编程语言C, C++,Java 等等.
    体系结构IA-32, IA-64, AMD64, IA-32E
    代码移植
    数据移植
    性能和功能测试
* 部署
    移植好的程序进行打包
    生产环境测试
    认证
    可用性分析
* 管理
    安全补丁和系统勘误通知
    自动更新
    自动升级

9) 推荐的参考资料
    * UNIX to Linux Porting: A Comprehensive Reference
      By Alfredo Mendoza, Chakarat Skawratananond, Artis Walker
    * Producing Open Source Software