FreeBSD系统编程NathanBoeger和ManaTominaga版权所有简体中文版由ChinaUnix论坛提供翻译2006年3月14日目录序言i0.1序言......................................i0.2为什么选择BSD?...............................iii0.3谁需要这本书.................................iii0.4关于作者...................................iv1FreeBSD的make11.1FreeBSD的make...............................11.2Makefile布局.................................21.3语法......................................21.4目标......................................21.5求值规则...................................41.6变量......................................51.7命令......................................71.8条件语句(#if,#ifndef等等)........................91.9系统Makefiles,模板以及.include指令...................121.10高级选项...................................131.11转换规则(后缀规则)............................141.12有用的命令行选项..............................151.13一个最后的例子................................172自举BSD202.1自举BSD...................................202.2FreeBSD的自举过程.............................202.3加载器.....................................242.4开始内核服务.................................243进程和内核服务283.1进程和内核服务................................283.2调度......................................283.3系统进程...................................303.4进程创建和进程ID系统...........................313.5子进程.....................................323.6运行二进制程序................................364高级进程控制和信号394.1高级进程控制和信号.............................394.2信号......................................394.3系统调用...................................454.4信号处理...................................464.5信号掩码(阻塞与开启信号)........................484.6自定义行为..................................504.7等待信号...................................514.8Alarms.....................................535基本I/O555.1基本输入输出.................................555.2I/O.......................................555.3文件上锁...................................615.4为什么用FLOCK...............................635.5进程间通信..................................645.6消息队列...................................665.7结论......................................676高级I/O686.1高级I/O和进程资源.............................686.2select......................................696.3poll.......................................706.4kqueue.....................................736.5结论......................................807进程资源和系统限制817.1进程资源和系统限制.............................817.2确定系统限制.................................817.3确定进程资源使用量.............................847.4小结......................................878FreeBSD5.x888.1FreeBSD5.X.................................888.2启动布局...................................8828.3Devfs......................................888.4a.out......................................898.5gcc-3.2工具链.................................898.6SMPng.....................................898.7内核调度实体.................................898.8小结......................................903序言10.1序言BSD是一个基于原先AT&TUNIX操作系统的一个修改增强版的操作系统家族。BSD自己复杂的历史已经被核心内核开发成员MarshallKirkMcKusick在其“OpenSource:VoicefromtheOpenSourceRevolution”(O’Reilly,1999)一书中的短文集中叙述过。它是围绕这个最流行的开源工程之一的历史和技术细节上全面的纵览。完整的章节可以在线获取。概括来说,BSD操作系统要追述到20世纪70年代末,当时AT&T拥有Unix。虽然Unix是私有的,却可以得到源代码,这鼓舞了用户修改他们自己的系统。其中一个这样的用户就是加洲伯克利大学的计算机系统研究组。他们的Unix版本被称为伯克利系统发行版(berkeleySystemDistributionBSD)。任何拥有Unix源代码授权的人都可以通过象征性的费用得到BSD磁带。BSD受到了美国国防部的大力推动,他们选择BSD作为基础来实现TCP/IP,这后来演变为Internet。TCP/IP的源代码通过1989年的网络发行第一版(Net/1)自由传播。以前,BSD需要一份AT&TUnix系统和源代码授权来编译和运行;但是现在,BSD代码几乎完全替代了所有的UnixOS子系统,演变为一个独立的操作系统。一个几乎完整的,没有AT&T代码的系统被发行为网络发行版2.Net/2,发行于1991年,只差6个文件就是一个完整的系统并且是自由传播的。一个叫386/BSD的发行很快就出现了,它补全了那六个文件。386/BSD的后续开发非常有限;其他几个分支很快出现,包括NetBSD、FreeBSD,都是自由软件,还有商业的BSDI。1992年,AT&T的Unix系统实验室(USL)起诉BSDI和加洲大学,宣告BSDI和Net/2使用了它的私有代码和知识产权。1994年的判决结果导致一个叫4.4BSD-Lite的Net/2修改发行版。所有基于这个版本的工程都免于被USL起诉,那时候USL属于Novell。结果,NetBSD、FreeBSD和BSDI都以4.4BSD-Lite为基础来开发他们的系统。在1995年又发行一个版本,4.4BSD-Literelease2,然后CSRG(计算机科学研究组)永久性的关闭了。BSD开发及后期的CSRG后来分化为几个不同的种类。虽然开发模式(一个核心,许多环绕)类似Linux,各种BSD家族分支和各种Linux发行是很不相同的。其中最广为所知的是FreeBSD、OpenBSD、NetBSD和Darwin。他们都在积极的开发中,附加源代码并且所有人都可以自由获取。FreeBSD1译者:meilincore@chinaunix开发最初集中在X86平台并致力于最佳性能。NetBSD致力于可移植性(几乎运行在现有所有平台上)和优雅。还盯着嵌入式系统。OpenBSD,最近的一个NetBSD分支,通过源代码审查和加密系统集成强调安全性。苹果公司OSX的核心Darwin,基本上是一个BSD系统加一个Mach微内核在上面。始于NeXTStep2。FreeBSD是为DECAlpha、PC-98和x86兼容系统构架设计的一个久经考验的操作系统。针对互连网和内部网络服务进行优化,有很强的网络和安全特性。其他平台如PowerPC和Sparc64的移植工作正在进行。在所有自由BSD当中,FreeBSD部署最为广泛,拥有象Yahoo这样有目共睹的商业用户。软件包也是非常多的–写这本书的时候,7883种程序已经被移植到FreeBSD。而且,如果有Linux的程序,FreeBSD的Linux兼容支持让你可以几乎本地的运行Linux程序。FreeBSD经常为其技术性的简便而倍受赞扬。比如,他的安装程序被广泛的认为是所有Unix安装程序中最简单的。并且Ports集合是一个结合原始代码和FreeBSD相关补丁来构建和安装附加软件的一个非常优雅的系统。写这本书的时候,大约8000个软件包存在于Ports集合。NetBSD和OpenBSD都采用Ports集合来管理附加软件包。但是都没有完全包含存在的软件。FreeBSD的开发模式是BSD的一个范例。它是高度集中的,并且有一个清晰的层次。有一个拥有超过200多个叫做committer的开发人员的组。这些人员可以在任何时候修改FreeBSD的源代码。这些committer由核心组挑选,一个选出来的commiter组,由他们自己挑选,选举每年都会举行。当FreeBSD集中至力于386平台开发的时候,其余的开始移植BSD到其他平台。值得注意的是VirginiaTech的Macintosh,这些努力很快蔓延到AtariSt、Amiga和PC平台。在FreeBSD继续至力于i386平台操作系统的深度优化的时候,NetBSD开始致力于移植到其他平台的开发。写这本书的时候,NetBSD是BSD分支当中支持平台最为广泛的。在奇异的硬件支持上也值得注意,比如短命的SegaDreamcast游戏终端。NetBSD还拥有WasabiSystems的商业支援,一个NetBSD开发人员成立的公司,致力于移植NetBSD到新的微处理器和系统。OpenBSD由NetBSD的SPARC移