Unix/Linux 标准化历史标准化目前已经成为 Linux 系统上的一个热门话题。实际上,在 Linux 诞生之初,这个问题就得到了重视。当 Linus 在开发 0.01 版本的 Linux 内核时,就开始关注 POSIX 标准的发展,他在 /include/unistd.h 文件中定义了几个与 POSIX 有关的宏,以下内容就节选自 0.01 版本内核的 /include/unistd.h 文件:
1
2
| /* ok, this may be a joke, but I'm working on it */
#define _POSIX_VERSION 198808L
|
下面我们就从 POSIX入手开始介绍 Unix/Linux 方面的标准化发展历程。
POSIXUnix 1969 年诞生于 AT&T 贝尔实验室,并在 1973 年使用 C 语言进行了重写,从此就具有了很好的可移植性。但是当 AT&T 在 1984 年由于分拆而得以进入计算机领域的市场之后,却引发了 Unix 业界的一场大战。当时最为主要的两个版本是 AT&T 的 System V 和伯克利的 BSD。二者在技术方面(例如终端)和文化方面都存在很多分歧,导致应用程序很难在不同的系统上平滑地进行移植,为了解决这个问题,IEEE(Institute of Electrical and Electronic Engineers)的 1003 委员会着手开发了一系列标准,这就是后来的 POSIX(Portable Operating System Interface for UNIX)标准。其目的是为那些兼容各种 UNIX 变种的应用程序制定应用程序编程接口(API)规范,从而确保这些应用程序的兼容性。这些标准后来被 ISO/IEC 采纳,成为 ISO/IEC 9945 标准。
POSIX 在 15 份不同的文档中对操作系统与用户软件的接口进行了规范,主要内容包括3个部分:
- POSIX 系统调用
- POSIX 命令和工具
- POSIX 兼容测试
同时还提供了一套 POSIX 兼容性测试工具,称为 PCTS(POSIX Conformance Test Suite)。
后来 POSIX 标准又进行了很多扩充,主要包括:
- POSIX.1,核心服务:主要集成了 ANSI C 标准,包括进程创建和控制、信号、浮点异常、段错误、非法指令、总线错误、定时器、文件和目录操作、管道、C 标准库、I/O 端口和控制
- POSIX.1b,实时扩展:包括优先级调度、实时信号、时钟和定时器、信号量、消息传递、共享内存、异步和同步 I/O、内存锁
- POSIX.1c,线程扩展:包括线程创建和控制、线程调度、线程同步、信号处理
POSIX 最初的设计目标是为 Unix System V 和 BSD Unix 等 Unix 系统上的特性制定规范,使其可以实现更好的可移植性。但是很多其他系统都也兼容POSIX 标准。例如,微软的 Windows NT 就兼容 POSIX 标准的实时部分(POSIX.1b),而 RTOS(LynxOS real-time operating system)也与 POSIX 标准兼容。Windows 上可以通过安装 Windows 的 Services for UNIX 或 Cygwin 来增强对 POSIX 标准的兼容度。
Open GroupOpen Group 是现在 Unix 商标的拥有者,其前身是 X/Open。X/Open 是 Unix 厂商在 1984 年成立的一个联盟,它试图为众多 Unix 变种定义一个安全公共子集,因此即使在 Unix 混战的年代,也得到了比较好的发展。在 1993 年,包括主要 Unix 公司在内的75 家系统和软件供应商委托 X/Open 为 Unix 制定一个统一的规范。X/Open在现有标准基础上,增加了对终端进行处理的 API 和 X11 API,并全面兼容 1989 ANSI C 标准,最终诞生了第一版本的单一 Unix规范(Single Unix Specification,简称 SUS)。
X/Open在 1996 年与 OSF(开放软件基金会)进行合并,成立了 Open Group 组织,专门从事开放标准的制定和推广工作,并对很多领域提供了认证,包括 Unix 操作系统、Motif 和 CDE(Common Desktop Environment)用户界面。
Austin GroupAustin Group 是在 1998 年成立的一个合作技术工作组,其使命是开发并维护 POSIX.1 和 SUS 规范。Austin Group 开发规范的方法是"write once, adopt everywhere",即由 Austin Group 制定的规范既会成为 IEEE POSIX 规范,又会成为 Open Group 的 技术标准规范,以后又会被采纳为 ISO/IEC 的标准。新开发的规范后来就被标准化为 ISO/IEC 9945 和IEEE Std 1003.1,并成为 SUSV3 的核心部分。
这种独特的开发模式最大限度地利用了业界领先的工作成果,将正式的标准化工作转化成了一个唯一的行为,并且吸引了广泛的参与者。Austin Group 目前有 500 多个参与者,工作组的主席是 Open Group 的 Andrew Josey。
LSB在90 年代中期,Linux 也开始了自己的标准化努力。实际上,Linux 一直都试图遵守 POSIX 标准,因此在源代码级上具有很好的兼容性,然而对于 Linux 来说,仅仅保证源码级的兼容性还不能完全满足要求:在 Unix 时代,大部分系统都使用的是专有的硬件,软件开发商必须负责将自己的应用程序从一个平台移植到其他平台上;每个系统的生命周期也很长,软件开发商可以投入足够的资源为各个平台发布二进制文件。然而 Linux 使用的最广泛的 x86 通用平台,其发行版是如此众多,而发展却如此之快,软件开发商不可能为每个发行版都发布一个二进制文件,因此就为 Linux 上的标准化提出了一个新的要求:二进制兼容性,即二进制程序不需要重新编译,就可以在其他发行版上运行。
实际上,在 Linux 社区中第一个标准化努力是文件系统层次标准(Filesystem Hierarchy Standard,FHS),用来规范系统文件、工具和程序的存放位置和系统中的目录层次结构,例如 ifconfig 命令应该放在 /usr/bin 还是 /usr/sbin 目录中,光驱应该挂载到 /mnt/cdrom 中还是 /media/cdrom 中。这些需求最终共同促进了 Linux Standard Base(LSB)项目的诞生。
LSB目前是 FSG(Free Standards Group)中最为活跃的一个工作组,其使命是开发一系列标准来增强 Linux 发行版的兼容性,使各种软件可以很好地在兼容 LSB 标准的系统上运行,从而可以帮助软件供应商更好地在 Linux 系统上开发产品,或将已有的产品移植到 Linux 系统上。
LSB 以 POSIX 和 SUS 标准为基础,并对其他领域(例如图形)中源代码的一些标准进行了扩充,还增加了对二进制可执行文件格式规范的定义,从而试图确保 Linux 上应用程序源码和二进制文件的兼容性。
LSB 简介LSB 是 Linux 标准化领域中事实上的标准,它的图标(请参看图 1)非常形象地阐述了自己的使命:对代表自由的企鹅(Linux)制定标准。给定企鹅的体形和三维标准之后,软件开发者就可以设计并裁减出各色花样的衣服(应用程序),这样不管穿在哪只企鹅身上,都会非常合身。
图1. LSB图标在现有标准基础上,LSB 制定了应用程序与运行环境之间的二进制接口,这主要是基于以下标准:
- Single UNIX Specification(SUS)
- System V Interface Definition(SVID)
- compilers for the Intel Itanium processor
- C++ ABI
- System V Application Binary Interface(ABI)
同时,LSB 充分吸取了 UNIX 标准化努力所取得经验和教训,回避了这些标准的一些问题。例如,POSIX 仅仅定义了编程接口的标准,但是它却无法保证二进制的兼容性。而诸如 OSF/1 之类的标准虽然试图解决二进制兼容性的问题,但是限制却太为严格。LSB 在二者之间达成了一个平衡,它包含了一个二进制兼容层,同时消除了 POSIX 与 OSF/1 之间存在分歧的地方。
LSB 对各个库提供的接口以及与每个接口相关的数据结构和常量进行了定义,图2给出了 LSB 3.1 环境中所包含的组件。这些组件包括开发者所需要的共享库(包括 C++),文件系统层次结构(FHS)、对象文件格式、命令和工具、应用程序包、用户和组、系统初始化等所采用的规范:
图2. LSB 规范包含的组件组织架构为了保证 LSB 项目的良好运行,LSB 采用了自己的完整组织架构来负责整个项目的运行,包括主席、选举委员会、执行委员会:
- 主席:由选举委员会选举产生,任期两年,负责 LSB 项目的整体运作,并对 FSG 和社区代表 LSB项目。目前的主席是 Debian 的创始人 Ian Murdock.。
- 选举委员会:由所有对 LSB 作出贡献的人组成,负责在主席任期期满时选举下一任主席。
- 执行委员会:由主席和各个子项目的领导人以及对 LSB
- 项目有重大贡献的人组成,可以对外作为 LSB 项目的发言人。
工作组LSB 项目包含几个子项目(也称为工作组),分别负责不同的职责范围,简介如下:
- Specification SubGroup:负责开 LSB 规范的开发与维护,还要负责 ISO/IEC 23360(即 ISO LSB 标准的维护)。具体职责如下:
- 维护 LSB 规范数据库
- 编写 LSB 规范
- 开发并维护生成规范文档所需要的工具
- LSB Tools SubGroup:负责以下子项目的开发和实现:
- SI(Sample Implementation):遵守 LSB 规范的一个参考实现
- Development Environment:开发符合 LSB 规范的应用程序的开发环境
- Application Battery:符合 LSB 规范的样例应用程序,例如 lsb-apache
- LSB Test SubGroup:负责按照 LSB 规范的定义,开发一些测试套件,来验证用户环境和应用程序是否符合 LSB 规范,主要包括:
- LSB Runtime Tests:包括ANSI、POSIX、LSB-OS、线程、用户和组、FHS、国际化、PAM(可插入认证模块)等测试套件
- LSB VSW4/XTS5 Test:Xlib11及其扩展库的测试套件
- LSB C++ Test:C++ 测试套件
- LSB Desktop SubGroup:负责开发与桌面有关的规范的测试套件,用来验证用户环境和应用程序是否符合 LSB 规范,主要包括:
- GTK 库
- OpenGL 库
- PNG12库
- JPEG 库
- Fontconfig 库
- GTK+ Stack 库
- QT3/4 库
- XML2 库
- LSB Future SubGroup:负载开拓 LSB 的新领域,将已经发展比较成熟可以进行标准化但 LSB 尚未涉及的领域纳入 LSB 标准范围内
|