本书由上、下两篇组成。上篇为UNIX版本6的源代码,下篇是莱昂先生对UNIX操作系统版本6源代码的详细分析。本书语言乘法、透彻,曾作为末公开出版特广流传了二十多年,是一部杰出经典之作。本书适合UNIX操作系统编程人员、大专院校师生学习参考使用。\r\n
献辞\r\n致谢\r\n序(一)\r\n序(二)\r\n历史注记\r\n上篇 UNIX操作系统版本6源代码\r\nUNIX操作系统过程分类索引\r\nUNIX操作系统文件及过程\r\nUNIX操作系统定义的符号列表\r\nUNIX操作系统源代码交叉引用列表\r\n第一部 分初始化、进程初始化\r\n第二部 分陷入、中断、系统调用和进程管理\r\n第三部 分程序交换、基本输入l输出、块设备\r\n第四部 分文件和目录、文件系统、管道\r\n第五部 分面向字符的特殊文件\r\n下篇莱昂氏UNIX源代码分析\r\n前言\r\n第1章 绪论\r\n1.1 UNIX操作系统\r\n1.2 公用程序\r\n1.3 其他文档\r\n1.4 UNIX程序员手册\r\n1.5 UNIX文档\r\nl.6 UNIX操作系统源代码\r\n1.7 源代码中各部分\r\n1.8 源代码文件\r\n1.9 分析的使用\r\n1.10 对程序设计水平的一条注释\r\n第2章 基础知识\r\n2.l 处理机\r\n2.2 处理机状态字\r\n2.3 通用寄存器\r\n2.4 指个集\r\n2.5 寻址方式\r\n2.5.1 寄存器方式\r\n2.5.2 寄存器延迟方式..\r\n2.5.3 自动增1方式\r\n2.5.4 自动减1方式\r\n2.5.5 变址方式\r\n2.5.6 立即方式\r\n2.5.7 相对方式\r\n2.6 UNIX汇编程序\r\n2.7 存储管理\r\n2.8 段寄存器—\r\n2.9 页说明寄存器\r\n2.10 存储分配\r\n2.11 状态寄存器—\r\n2.12 i和d空间\r\n21.3 启动条件\r\n2.14 专用设备寄存器\r\n第3章 阅读C程序\r\n3.1 某些选出的例子\r\n3.2 例1\r\n3.3 例2\r\n3.4 例3\r\n3.5 例4\r\n3.6 例5\r\n3.7 例6\r\n3.8 例7\r\n3.9 例8\r\n3.10 例9\r\n3.11 例10\r\n3.12 例11\r\n3.13 例12\r\n3.14 例13\r\n3.15 例14\r\n3.16 例15\r\n3.17 例16\r\n3.18 例17\r\n第4章 概述\r\n4.1 变量分配\r\n4.2 全局变量\r\n4.3 C预处理程序\r\n4.4 第一部分\r\n4.4.1 第1组h文件\r\n4.4.2 汇编语言文件\r\n4.4.3 在第一部分中的其他文件\r\n4.5 第二部分\r\n4.6 第三部分\r\n4.7 第四部分\r\n4.8 第五部分\r\n第一部分初始化、进程初始化\r\n第5章 两个文件\r\n5.l 文件malloc.c\r\n5.1.l 列表维护规则\r\n5.1.2 malloC(252)\r\n5.1.3 mfree(2556)\r\n5.1.4 结论—\r\n5.2 文件Prf.c\r\n5.2.l printf(234)\r\n5.2.2 printn(2369)\r\n5.2.3 putchar(2386)\r\n5.2.4 panic(2419)\r\n5.2.5 prdev(2433)、deverror(2447)\r\n5.3包含的文件\r\n第6章 系统动启\r\n6.1 操作员的动作\r\n6.2 start(0612)\r\n6.3 main(1550)\r\n6.4 进程\r\n6.5 Proct(0)的初始他\r\n6.6 sched(1940)\r\n6.7 sleep(2066)\r\n6.8 SWtCh(2178)\r\n6.9 再回到 main\r\n第7章 进程\r\n7.1 进程映像\r\n7.2 proc结构(0358)\r\n7.3 user结构(0413)\r\n7.4 每个进程数据区\r\n7.5 段\r\n7.6 映像的执行\r\n7.7 核心态执行\r\n7.8 用户态执行\r\n7.9 一个实例\r\n7.10 设置段寄存器\r\n7.11 estabur(1650)\r\n7.12 sureg(1739)\r\n7.13 newproc(1826)\r\n第8章 进程管理\r\n8.l 进程切换\r\n8.2 中断\r\n8.3 程序交换\r\n8.4 作业\r\n8.5 汇编语言过程\r\n8.6 savu(072)\r\n8.7 rein(074)\r\n8.8 aretu(073)\r\n8.9 SWtCh(2178)\r\n8.10 setpri(2156)\r\n8.11 sleep(206)\r\n8.12 wakeup(2133)\r\n8.13 setrun(2134)\r\n8.14 expand(2268)\r\n8.15 再回到 swtch\r\n8.16 临界区\r\n第二部分 陷入、中断、系统调用和进程管理\r\n第9章 硬件中断和陷入\r\n9.l 硬件中断\r\n9.2 中断矢量\r\n9.3 中断处理程序\r\n9.4 优先级\r\n9.5 中断优先级\r\n9.6 中断处理程序的规则\r\n9.7 陷入\r\n9.8 汇编语言trap\r\n9.9 返回\r\n第10章 汇编语言 trap例程\r\n10.l 陷入和中断源\r\n10.2 fuibyte(0814)与fuiword(0844)\r\n10.3 中断\r\n10.4 call(077)\r\n10.5 用户程序陷入\r\n10.6 核心态栈\r\n第11章 时钟中断\r\n11.I clock(3725)\r\n11.2 timeout(3845)\r\n第12章 陷入与系统调用\r\n12.l trap(269)\r\n12.2 核心态陷入\r\n12.3 用户态陷入\r\n12.4 系统调用:..\r\n12.5 系统调用处理程序\r\n12.6 文件Sysl.C\r\n12.6.1 exeC(302)\r\n12.6.2 fork(3322)\r\n12.6.3 sbreak(3354)\r\n12.7 文件SyS2.C和SyS3.C\r\n12.8 文件SyS4.C\r\n第13章 软件中断\r\n13.1 设置期望动作\r\n13.2 对进程造成中断\r\n13.3 作用\r\n13.4 跟踪\r\n13.5 过程\r\n13.5.l 期望动作的设置\r\n13.5.2 造成软件中断\r\n13.13 作用\r\n13.5.4 跟踪:\r\n13.6 SSig(3614)\r\n13.7 kill(3630)\r\n13.8 signal(3949)\r\n13.9 psignal(3963)\r\n13.10 issig(3991)\r\n13.11 psig(404刀\r\n13.12 ocre(4094)\r\n13.13 grow(4136)\r\n13.14 exit(321)\r\n13.15 rexit(3205)\r\n13.16 wait(327)\r\n13.17 跟踪\r\n13.18 stop(4016)\r\n13.19 wait(3270)(继续)\r\n13.20 ptrace( 64)\r\n13.21 procxmt(4204)\r\n第三部分 程序变换、基本输入偷出、块设备\r\n第14章 程序交换\r\n14.l 正文段\r\n14.2 sobed(1940)\r\n14.3 xswap(4368)\r\n14.4 xalloc(4433)\r\n14.5 xfree(4398)\r\n第15章 基本输入/输出介绍\r\n15.l bUf.h文件\r\n15.2 devtab(4551)\r\n15.3 conf.h文件\r\n15.4 conf.c文件\r\n15.5 系统生成\r\n15.6 swap(sl 96)\r\n15.7 竞态条件\r\n15.8 可重入\r\n15.9 继续分析u.uss.v\r\n第6章 RK磁盘驱动器\r\n16.1 控制状态寄存器RKCS\r\n16.2 字计数寄存器RKWC\r\n16.3 磁盘地址寄存器RKDA\r\n16.4 rk.c文件\r\n16.5 rkstrategy(5389)\r\n16.6 rkaddr(5420)\r\n16.7 devstart(5096)\r\n16.8 rkintr(5451)\r\n16.9 iodone(5018)\r\n第17章 缓存处理\r\n17.l 标志\r\n17.2 一个类超高速缓存存储\r\n17.3 clrbuf(503)\r\n17.4 incore(4899)\r\n17.5 getulk(4921)\r\n17.6 brelse(4869)\r\n17.7 binit5055)\r\n17.8 bread(4754\r\n17.9 breada(4773)\r\n17.10 bwrite(480)\r\n17.11 bawrite(4856)\r\n17.12 bdwritC(483)\r\n17.13 bflush(5229)\r\n17.14 physic(5259)\r\n第四部分 文件和目录、文件系统、管道\r\n第18章 文件存取和控制\r\n18.l 源代码第四部分\r\n18.2 文件特征\r\n18.3 系统调用\r\n18.4 控制表\r\n18.4.l file(5507)\r\n18.4.2 inode(5659)\r\n18.5 要求专用的资源—\r\n18.6 打开一个文件\r\n18.7 creat(5781)\r\n18.8 openl(5804)\r\n18.9 oped(5763)\r\n18.10 再回到 openl\r\n18.11 close(5846)\r\n18.12 closef(6643)\r\n18.13 iput(7344)\r\n18.14 删除文件\r\n18.15 读和写文件\r\n18.16 rdwr(5731)\r\n18.17 readi(6221)\r\n18.18 writei(6276)\r\n18.19 iomove(6364)\r\n18.20 bmap(6415)\r\n18.21 剩余部分\r\n第19章 文件目录和目录文件\r\n19.1 文件名\r\n19.2 目录数据结构\r\n19.3 目录文件\r\n19.4 namei(7518 )\r\n19.5 一些注释\r\n19.6 link(5909)\r\n19.7 wdir(747)\r\n19.8 maknode(7455)\r\n19.9 unlink(351)\r\n19.10 mknod(5952\r\n19.11 access(6746)\r\n第20章 文件系统\r\n20.l 超级块(5561)\r\n20.2 mount表(0272)\r\n20.3 iinit(692)\r\n20.4 安装\r\n20.5 smount(6086)\r\n20.6 注释\r\n20.7 iget(727)\r\n20.8 getfs(7167)\r\n20.9 updatC(720)\r\n20.10 sumount(6 144)\r\n20.11资源分配\r\n20.12 alloc(6956)\r\n20.13 itrunc(7414)\r\n20.14 free(7000)\r\n20.15 iput(734)\r\n20.16 ifree(71 34)\r\n20.17 iupdat(737)\r\n第21章 管道\r\n21.l pipe(7723)\r\n21.2 readp(7758\r\n21.3 writep(780)\r\n21.4 plOCk(786)\r\n21.5 prele(788)\r\n第五部分 面向字符的特殊文件\r\n第22章 面向字符的特殊文件\r\n22.1 LPll行式打印机驱动程序\r\n22.2 lpopen(885)\r\n223 注释\r\n22.4 lpoutput(8986)\r\n22.5 lpstart(8967)\r\n22.6 lpint(8976)\r\n22.7 lpwrite(887)\r\n22.8 lpclose(886)\r\n22.9 讨论\r\n22.10 lpcanon(887)\r\n22.11 对读者的建议\r\n22.12 PCll纸带阅读机/穿孔机驱动程序\r\n第23章 字符处理\r\n23.I cinit(8234)\r\n23.2 getc(093)\r\n23.3 plltC(096)\r\n23.4 字符集\r\n23.5 图形字符、\r\n23.6 UNIX惯例\r\n23.7 maptab(sll7)\r\n23.8 pariah(7947)\r\n第24章 交互式终端\r\n24.1 接口\r\n24.2 tty结构(792)\r\n24 3 注释\r\n24.4 初始化\r\n24.5 stty(sl 83)\r\n24.6 sgtty(8201)\r\n24.7 klsgtty(8090)\r\n24.8 ttystty(8577)\r\n24.9 DLll/KLll终端设备处理程序\r\n24.10 设备寄存器\r\n24.11 接收器状态寄存器\r\n24.12 接收器数据缓存寄存器\r\n24 13 发送器状态寄存器\r\n24.14 发送器数据级存寄存器\r\n24.15 单总线地址\r\n24.16 软件方面的考虑\r\n24.17 中断矢量地址\r\n24.18 源代码\r\n24.19 klopen(8023)\r\n24.20 klclose(8055)\r\n24.21 klxint(8070)\r\n24.22 klrint(8078)\r\n第25章 tty.c又件\r\n25.l flushtty(8252)\r\n25.2 Wflllshtty(821)\r\n25.3 字符输入\r\n25.3.l ttread(853)\r\n25.3.2 canon(8274)\r\n25.3.3 前一个字符不是外\r\n25.3.4 前一个字符是“/”\r\n25.3.5 字符准备\r\n25.3.6 已得到1行\r\n253.7 注释\r\n25.3.8 ttyinput(8333)\r\n25.4 字符输出\r\n25.4.l ttwrite(8550)\r\n25.4.2 ttstart(8505)\r\n25.4.3 ttrstrt(8486)\r\n25.4.4 ttyOUtpUt(8373)\r\n25.4.5 具有受限字符集的终端\r\n25.5 结束语\r\n第26章 练习\r\n罗斯跋\r\n奥德尔跋\r\n古德哈特跋\r\n克林森跋\r\n雷杰斯跋\r\n作者小传
正式出版约翰·莱昂编著的《莱昂氏UNIX源代码分析》标志着一个悠长故事的圆满结束。
UNIX的传播总是伴随着变化着的商业世界和研究及学术社团利益之间的不相一致和对立的观点。70年代和80年代期间,在系统源代码的分发方面非常自由的政策鼓励了很多创造性的开发工作,特别是在加州大学伯克利分校所进行的工作对于构造今日的Internet和工作站产业是非常重要的。同时,法人团体的管理人员则一直担心他们的企业和社团会失去一切权利。
莱昂源代码分析的故事也说明了这种紧张的关系。当肯·汤姆森和我两人见到这两本包含注释和源代码的册子时(原书分两册),都为其及时出现而感到欣慰,同时也为他的深刻的洞察力和在课程安排方面的技巧而留下深刻印象。UNIX支持组与我们有同感。他们重印了这两本书并用于贝尔实验室的训练课程。大约两年之后,莱昂应邀到UNIX支持组工作一年,担任顾问并进行写作。贝尔实验室和UNIX社会对以莱昂为核心的一群澳大利亚人的聪明才智表示赞赏并因之受益,他们集中在莱昂工作的新南威尔士大学,有些则来自悉尼大学和另外一些地方。在澳大利亚以外,也有遍布世界的大量人群通过阅读这本书学习操作系统。
但是对立的观点仍然十分明显:本书的重要价值和叙述的生动活泼也引起了关注, 由此而来的是UNIX版本7的许可证注明禁止使用其源代码用作教学材料。尽管如此,本书、版本7源代码及为VAX体系结构开发的后继者的源代码(贝尔实验室开发的32位版本及各种BSD系统)仍然是处处可见并在80年代早期的重要开发中得到应用。
不同的观点基本围绕着下面的问题:在公开出版软件及对软件的注释,以及鼓励有关人员学习它们的同时又如何仍能保持商业和技术方面的控制,这一问题至今仍未解决,并且无疑并不存在解决方案。自由软件基金会希望所有软件的源代码都是可以使用的。学术界的大多数人基本上同意此种观点,但是其中也有相当一部分人希望保持权利并从中获利。工商业界则希望捍卫权利并谋取尽可能多的利润。在过去的很多年中,UNIX在此方面激起了波涛。
令人感到欣慰的是,SCO——当前提供UNIX操作系统和应用程序的领导者,认为出版莱昂的分析及相关源代码具有历史和教育方面的价值,并同意其公开出版。我为此向该公司表示感谢。
本书中的材料确定是有点过时了,其内容不包括图形、网络以及1975年后出现的新事物。即使在1979年的编译中也不再使用的线性搜索、基本数据结构和C代码还保留在本书的源代码中,而该代码面向的计算机非常简单,只比存储器稍稍争一些。从中你会发现有很多粗糙之处。但是在代码中你也可以观察到其基本结构,该结构沿用了很长时间,而且能够包容在计算环境中发生的巨大变化。在莱昂的分析中,你可以觉察到新鲜的、经常提出问题的立场,其中的很多词语和思想都很适宜于教育和学习。莱昂非常清楚地赞赏他阅读的UNIX源代码,但又立即指出其不足之处。他帮助他的学生理解蕴含在源代码中的很多思想和主题,也坦率地说明他对该代码某些部分感到的困惑之处。
此处重印的文献已经教育了一代人,它是计算机界中复印数量最多的一本书稿。将此公开记录在案是件大好事。