基本信息
编辑推荐
节选10000行UNIX内核源码
耳目一新的视角
入木三分的剖析
生动详尽的图例
作者实现的线程
恰似醍醐灌顶,让你彻底了解UNIX内核。
内容简介
计算机书籍
操作系统是一种对计算机中各个设备和资源进行管理并给应用软件提供各种服务的系统软件,它的实现可分用户态和内核态两大部分。一般而言,操作系统的算法和设计的复杂性大多在内核态部分。因此,了解操作系统的内核实现对于了解整个操作系统是非常重要的。
本书详细阐述操作系统的内核(也包括少量用户态部分),选择UNIX第6版的全部内核代码及少量用户部分代码、总计10 000行作为讲解对象,由框架到细节、由基础到高级地进行讲述;在此过程中贯穿了操作系统中的各种知识和概念,比如内存管理、进程调度、中断和设备管理以及文件系统等,使得内容非常易于读者理解。
选择UNIX作为讲解对象是因为它强大的生命力和应用的广泛性。在精妙的设计思想下,它具有小巧高效而健壮的内核、丰富的功能、易扩展的架构和良好的开放性。UNIX所定义的很多接口(比如文件访问接口)已经成为行业标准。本书在讲解时,作者把这10 000行代码按照不同的功能模块分成不同的章节。每章一般最小以函数为单位,但在讲解某个功能或接口时,又会牵涉到很多相关的函数,并其中揭示了很多优秀的设计思想、数据结构和算法。
本书适用于具有丰富开发经验的高级软件工程师,尤其是有志于进行操作系统研究或对操作系统实现感兴趣的软件工程师,也可作为本专科院校计算机及相关专业学生学习操作系统和C语言的参考书。初级软件开发人员在阅读本书时可能会碰到一些困难,但如能坚持研究,它也会是你提高编程水平的一个很好的选择。
目录
1.1 历史背景 1
1.2 UNIX诞生的经过 1
1.3 UNIX版本6 2
1.4 各流派一览 2
1.5 为什么取得成功 3
1.5.1 简洁高效 3
1.5.2 健壮性 3
1.5.3 功能丰富 3
1.5.4 移植性 3
1.5.5 开放性 4
1.6 缩写及术语说明 4
第2章 UNIX综述 6
2.1 硬件平台 6
2.1.1 中断和自陷(Trap) 7
2.1.2 两种处理器模式 9
2.1.3 通用寄存器 10
2.1.4 I/O设备管理 10
2.1.5 栈(Stack) 11
2.1.6 常用指令 11
前言
为什么UNIX具有如此强大的生命力?原因就在于它精妙的设计思想、小巧高效而又健壮的内核、丰富的功能、易扩展的架构和良好的开放性。UNIX所定义的很多接口(比如文件访问)已经成为行业标准,而它的分支也十分众多,如Unixware、AIX、Solaris、BSD UNIX等。
UNIX最早是由贝尔实验室(Bell Labs)的Kenneth Thompson (肯尼思·汤普森)和 Dennis Ritchie(丹尼斯·里奇)开发的,在此过程中,他们还发明了C语言。在1972年他们推出了UNIX版本6(UNIX 6 Edition),这也是本书所要讲述的版本。
本书内容
本书节选了UNIX版本6的全部内核代码及少量用户部分代码,总计在10 000行左右。之所以选择它是因为这是贝尔实验室所开放的最后一版UNIX,而且相对于前几版,它更贴近于现代操作系统,几乎具备了现代操作系统的所有概念:如中断和自陷管理、进程调度、内存管理、文件系统、I/O设备管理等。而且,很多现在的常用命令当时也已实现,比如mkdir、ls、cd、exec、find、grep、cron等。另外,本版90%代码都使用C语言编写,代码量也不大,这就使得阅读更加方便,适合讲解。
作者在讲述代码时,不仅尽量忠于和体现原来的设计思想,而且对于某些可能不太完美的实现部分还相应指出并给出改进的意见。此外,对于UNIX版本6不具备的某些功能,比如进程间互斥、消息通信和线程功能,作者还在第13章、第14章给出了简单的示例实现。另外,作者在列举源代码时,都在之前指明其所在文件,个别地方未指明的,在最近一次所指明的文件中。
本书读者
本书适用于有志于操作系统研究或对操作系统实现感兴趣的软件工程师,也可作为本专科院校计算机及相关专业学生学习操作系统和C语言的参考书。而对于其他软件人员,本书也将是你提高编程水平的一个很好的选择,书中揭示了很多优秀的设计思想、数据结构和算法,相信它们能给你以不少启示,在此过程中你还能看到C语言所展示出的精练高效的强大魅力!书中的很多代码后来也成为C程序标本式的实现和风格。
本书光盘
本书附有光盘,光盘不仅包含书中所列代码(包括作者自己实现的部分),还包含其他很多代码,比如init进程、shell进程等的实现。此外,还包括shell所支持的各个命令的实现代码,甚至还包含了当时所用的编译器。
读者可以直接阅读本书,也可以打开光盘中的代码,对照本书阅读。另外,在阅读时,有些章节如果联系起来看效果会更好,比如第4章和第5章、第6章和第9章。
版权声明
第13章和第14章中作者所实现部分的代码,由于环境限制,并未经过实际测试,对它们所造成任何可能的损坏性后果,作者在此声明并不对此负责,敬请谅解。另外,该部分代码只限于个人学习研究使用,作者保留对该部分代码的一切发布、发行、使用、修改及拷贝的权利,如有任何个人或组织要将其用于商业目的,请和作者联系并支付相应费用。
致谢
感谢网络搜索引擎,感谢很多网站,特别是http://www.computer.museum.uq.edu.au/ documents.html,它提供了PDP 11系列芯片的丰富文档,以及http://minnie.tuhs.org/ UnixTree/V6/,它提供了UNIX V6完整的源代码。
联系方式
由于作者水平所限,书中难免存在不当甚至错误之处,敬请批评指正。同时,非常欢迎读者提问、评论、批评和建议,可以通过qf.hao@hotmail.com和我联系。
IBM高级软件开发工程师 郝庆丰
2009年8月于北京
序言
操作系统作为计算机中核心的系统软件,直接决定了计算机系统的整体性能。学习操作系统的过程中,理解所有操作系统设计背后的原理是非常重要的,但如果能够把这些原理和真实的操作系统实现结合起来,则可以更加深刻地理解操作系统的本质所在。
美国贝尔实验室的丹尼斯·里奇(Dennis Mac Alistair Ritchie)和肯尼思·汤普森(Kenneth lane·Thompson)共同开发的C和UNIX是本领域最重要的成果之一,对整个计算机产业产生了深远的影响。因此,通过深入分析阅读UNIX这一经典系统的源代码实现来学习操作系统是非常有价值的途径。UNIX 第6版(UNIX V6)是现代各类UNIX操作系统的源头,它具备了现代操作系统的绝大部分特征:进程管理和调度、内存管理、文件系统和I/O设备管理等。在此之后,UNIX分为众多不同流派,但它们基本上都秉承了UNIX V6的设计思想。
作者郝庆丰曾在朗讯、摩托罗拉等公司从事多年的软件开发工作,参与过多个UNIX及Linux下大型软件项目的设计和开发,有着数十万行代码的开发经验。基于这些基础,他编写了这本讲解UNIX的书籍,针对PDP-11处理器,给出UNIX V6近万行源码的详细解析,其中也包含了很多作者自己的开发经验和理解。在写作过程中,作者翻阅了大量资料,做了很多实验。因此,书中深入浅出、详略得当的讲解使得某些原本艰涩难懂的代码变得生动活泼,甚至妙趣横生。对于重点章节或很艰深的部分,作者则不吝笔墨、列举多个例子阐明;在每章结束还有针对性地提出一些思考题,让读者进一步巩固本章内容。
全书共分15章。第1章主要讲述UNIX诞生的经过、流派和它的特点。第2章主要讲述UNIX框架及其运行的硬件平台。第3章讲述虚拟内存的主要功能及UNIX虚拟内存的实现原理。第4章主要讲述启动过程。第5章主要讲述进程管理和调度的实现。第6章是对中断处理过程的讲解,而第7章讲述和中断类似的自陷的处理过程。第8章讲解文件系统,其实是文件系统的内核实现,而用户实现部分在第12章讲述。第9章讲解UNIX是如何管理I/O(输入/输出)设备的。第10章在第4章的基础上更全面地阐述UNIX的交换过程,因为交换是进程管理中一个很重要的概念。第11章讲述UNIX可执行文件的格式。第12章讲述UNIX系统调用的实现过程,包括了文件系统、进程和信号等部分。第13章不仅讲解已有的各种进程间通信的方式(信号、文件、管道),而且还给出其他多种进程间通信方式(信号量、互斥体、消息等)的示例实现。第14章给出现代操作系统才有的线程的示例实现。最后第15章讲述UNIX的登录过程和20世纪80年代出现的网络文件系统NFS,进而体现其对网络多用户的支持。
本书适用于具有丰富开发经验特别是想了解操作系统实现或对其感兴趣的软件工程师。
对于初级软件工程师,只要能认真研习,它也将是你提高软件开发水平的一个很好的选择。
清华大学计算机系教授、博士生导师 郑纬民
2010年4月15日于北京清华园
序 二
UNIX操作系统,诞生于四十余年前,作为一种革命性的软件产品,一直标示着软件业的顶尖水准。而UNIX 第6版,作为UNIX最后一个开放源码版本,历来是学习UNIX的最佳起点——这是中科院的必修课程,是麻省理工研究生院的必修课程。本书就是这样一本阐述其实现结构的巨著,它选择了UNIX第6版作为讲解对象,由框架到细节、由基础到高级,细述了各部分的实现和代码组成。
本书作者曾在朗讯、摩托罗拉等公司从事多年的软件开发工作,在UNIX及Linux平台下下有着非常丰富的开发经验,并对操作系统有着深入的研究。本书是作者在对UNIX第6版的每一行代码做了精心研究后所得出的理解和体会,是翻阅参考大量资料和实验验证的产物。正因为如此,本书中那些深入浅出、详略得当的讲解使得原本艰涩难懂的代码变得生动,甚至拍案叫绝。对于重点章节或晦涩的部分,作者不吝笔墨、列举多个例子予以阐明,例如第12章中对ptrace系统调用的解释,甚至给出了一个简单调试器(debugger)的实现。而对于相对次要或容易理解的部分,则一带而过,点到为止。值得称道的是,某些章节还例举大众熟知的Windows操作系统作为对比,以起到举一反三、融会贯通的效果。比如第8章就把UNIX文件系统实现和Windows FAT16做了比较,列举了各自的优劣所在。
作为本书的技术审校者,我是以学习的态度来阅读本书的。虽然我有着近二十年的操作系统与数据库工作经验,也常被封为所谓“技术专家”,但本书作者对UNIX入木三分的观点阐明使我受益颇深。更使我感动的是,作为一个真正的技术专家,作者对细节的处理态度——字字点到,句句说明!我们如何能不受益于这本书?
十年磨一剑,这是我对这本书的最真实感受!
不忍释手,一气读完,抬首看窗外,夜幕正在散去,黎明正在到来。回想我读的这本UNIX 6,正像是早晨的丝丝光线,它带我们穿越了繁杂的代码黑幕,揭示了UNIX的内部结构和来龙去脉,带给我们清晰的思想和逻辑!它能让我们拥有自信来掌握它、控制它,而不仅仅是对UNIX的顺从!
在Linux火热的今天,在UNIX大行其道的今天,让我们再上一步,给自己做一次“升级”,从一个低层次的代码堆砌者,成为一个有自己独立思想的系统架构师!
如果这样的程序员多了,中国怎能长时间地跟随欧美的脚步?更如何能走在印度后面?
感谢作者!
UNIX与数据库技术专家 侯文平
【插图】
