Unix V6 源码阅读
Posted 眷恋你的方圆
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unix V6 源码阅读相关的知识,希望对你有一定的参考价值。
原创,转载请说明
本科时C语言是学的第一门语言,大学期间也没有多用过,期间也是断断续续的学过几次,每次都是浅尝辄止,收获也没有多大
手里也没有和C语言相关的项目或者课题,也不知道怎么应用,既然想学一下,就打算先看一下一些简单的,或者优秀的开源软件。
前段时间看了一下 tinyhttp 这个项目的源码,很短,就几百行代码,不过这段时间没看估计又忘了差不多了,因为当时只是看了看
也没有做过笔记,这次打算看一下unix v6的源代码,反正闲着也是闲着,也打算在博客上记录下自己学习的过程,也算是种监督和
激励吧。
好,开始吧!!!
阅读用的材料是 《莱昂氏UNIX源代码分析》 很庆幸有先驱们把这本书给翻译成中文了,网上对这本书评价很高啊。简单看了下,
讲解的确实很详细。
############################################################
第四章 概述
本章是对源代码进行整体上的综述,及先看森林,再看树木
查看源代码将发现它由4 4个文件组成,其中:
• 两个是汇编语言文件,它们的名字带后缀“ . s”;
• 28个是用“C”语言编写的,它们的名字带后缀“ . c”;
• 14个是用“C”语言编写的,但并不准备单独编译,名字带后缀“ . h”。
这章主要把代码分成五部分来讲,或者说根据代码的所产生的功能分成了五种类型。
第一部分
第一部分包含了很多“ . h”文件和汇编语言文件。它也包含若干涉及系统初启和进程管理的文件。
(一) 第1组“.h”文件 共5个
param . h,不包含变量说明,但包含很多操作系统常数和参数的定义,以及三个简单结构的说明。
systm. h,主要由变量声明组成,其中作为定义了“ c a l l o u t”和“ m o u n t”两种结构。注意,其中没有一个变量是显式地赋予初值的,它们的初值都赋为0。头三个数组的长度是定义在“ p a r a m . h”中的参数。因此,任一包含“ s y s t m . h”的文件,必须在包含“s y s t m . h”之前先包含“p a r a m . h”。
seg . h,包含几个定义和一个说明,在引用段寄存器时使用这些定义和说明。此文件实际上可并入“ p a r a m . h”和“s y s t m . h”中。
proc . h,包含重要的“ p r o c”的说明。p r o c是一个结构类型,也是这种结构类型的一个数组。p r o c结构的每一个元素的名字都以“ p -”开始,没有其他他变量是这样命名的。类似的惯例用于命名其他结构的各元素。p r o c结构中头两个元素“ p_ s t a t”和“ p_ f l a g”的各种相关值都有单独的名字,它们也在“p r o c . h”中定义。
user. h,包含非常重要的“ u s e r”结构的说明,还包含一组与“ u_e r r o r”相关的定义值。在任一时刻只有一个“ u s e r”结构的实例是可存取的。该实例以名字“ u”引用,它位于长度为1 0 2 4字节的“每个进程数据区”的低地址部分。
一般而言,本书在此后不会对“ . h”文件进行详细而全面的分析。希望读者能反复地参阅它们,这样就会不断增加对它们的熟悉和理解程度。
(二) 汇编语言文件 共2个
有两个汇编语言文件,大约占源代码中的1 0 %。应当对这些文件有较高的熟悉程度。
low. s,包含初始化内存低地址部分的有关信息,包括陷入矢量。此文件是由名为“m k c o n f”的公用程序生成的,以适应在特定配置中具有的外部设备集。
m40 . s,包含一组与P D P 11 / 4 0相适应的例程,它们执行大量“ C”不能直接实现的特殊函数。我们将在适当的时间和位置对此文件的各部分进行介绍和讨论。(最大的汇编语言过程“ b a c k u p”已作为一个练习留给读者分析。)当使用P D P 11 / 4 5或P D P 11 / 7 0时,应将“m 4 0 . s”代换成“m 4 5 . s”但在这里我们没有提供此文件。
PDP11/40 是当时用的电脑的型号,当然现在已经没有了
(三)在第一部分中的其他文件 共4个
main . c,包含“ m a i n”,它执行多种初始化任务以使U N I X运行。它也包含“s u r e g”和“e s t a b u r”,它们设置用户态段寄存器。
slp . c,包含进程管理所需的各主要过程,包括:“n e w p r o c”、“s c h e d”、“s l e e p”和“s w t c h”。
prf . c,包含“p a n i c”和若干其他过程,它们提供了一种简单的机制向操作人员显示初始化消息和出错消息。
malloc . c,包含“m a l l o c”和“m f r e e”,它们的功能是对存储资源进行管理。
第二部分 陷入、硬件中断、软件中断 共7个
陷入和硬件中断造成C P U正常指令执行序列的突然切换。这提供了一种处理在C P U控制外产生的特殊条件的机制。这种设施也用作“系统调用”机制的一部分,在“系统调用”机制中,一用户程序可以执行一条“ t r a p”指令以故意造成一次陷入,从而取得操作系统的注意和帮助。
软件中断(或称“信号”)是一种特殊的进程间进行通信的机制,在产生“坏消息”时使用。
reg . h 定义了一组常数,当前用户态寄存器值存放在核心态栈中而且需要引用它们时,使用这一组常数。
trap . c 包含“C”过程“t r a p”,其功能是识别并处理各类陷入。
sysent . c,包含数组“s y s e n t”的说明及初值表,“t r a p”使用此数组按系统调用类型找到在核心态下执行的相应例程的入口地址。
sys1. c,包含多个与系统调用相关的例程,包括:“e x e c”、“e x i t”、“w a i t”和“f o r k”。
sys4 . c,包含“ u n l i n k”、“k i l l”及若干其他非主要系统调用的例程。
clock . c ,包含“c l o c k”例程,其主要功能是处理时钟中断,并且进行偶发事务及会计事务的大量处理。
sig. c, 包含处理“信号”或“软件中断”的过程。这些为进程通信及跟踪提供了能力。
第三部分 内存(主存)和磁盘存储器之间的基本输入/输出操作。 共7个
这些操作对程序换进换出以及磁盘文件的创建和引用活动是基础性的。本部分也包含使用和处理大缓存( 5 1 2字节)的各个过程。
text.h,定义“ text”结构和数组。系统使用一个“ text”结构定义一共享正文段(shared text segment)的状态。
text. c,包含管理共享段的各个过程。
buf . h,定义“b u f”结构和数组、“d e v t a b”结构以及“ b - e r r o r”可包含的各种值的符号名。为管理大缓存,所有这些都是必须的。
conf. h,定义结构数组“ b d e v s w”和“ c d e v s w”,它们指定了面向设备的各处理过程,为执行针对设备的逻辑文件操作,需调用这些过程。
conf. c,与“l o w. s”相似,“c o n f . c”是由公用程序“ m k c o n f”生成的,以适应特定系统配置的各种外部设备。它包含“ b d e v s w”和“c d e v s w”数组的初始化值表,这两个数组中设置的各个处理过程控制基本I / O操作。
bio . c,是“ m 4 0 . s”之后的最大一个文件,它包含了处理大缓存以及面向块的基本I / O的各个过程。
rk . c,是针对R K 11 / R K 0 5磁盘控制器的设备驱动程序。
第四部分 与文件及文件系统有关。 共13个
文件系统由一组文件和相关的表,以及目录组成,所有这些都组织存放在单个存储设备,例如磁盘包上。
本部分包含下述功能:
• 创建和存取文件。
• 通过目录定位文件。
• 组织并维护文件系统。
本部分也包括与特种文件“ p i p e”有关的代码。
f i l e . h,定义“f i l e”结构和数组
filsys . h,定义“ f i l s y s”结构,在装配和拆卸文件系统时,从超级块( s u p e rb l o c k )复制至该结构或反之。
ino . h,说明记录在“已装配”设备上的“索引节点” (“i n o d e s”)结构。此文件并不被任何其他文件包括,仅仅是为提供信息而存在。
inode. h,定义“i n o d e”结构和数组。在管理进程对文件的存取时,“i n o d e”起关键性作用。
sys2 . c,包含一组与系统调用相关的例程,这些系统调用是“ r e a d”、“w r i t e”、“c r e a t”、“o p e n”和“c l o s e”。
sys3. c,包含一组与多个非主要系统调用相关的例程。
rderi . c,包含与读/写文件有关的中间层次例程。
subr. c,包含与i / o有关的中间层次例程,特别是“ b m a p”,它将逻辑文件指针翻译成物理磁盘地址。
fio . c,包含与文件打开、关闭和存取控制有关的中间层次例程。
alloc. c,包含若干管理文件系统i n o d e和磁盘块资源的过程,它们负责分配“i n o d e”数组表目项和磁盘存储块。
iget . c,包含与更新和引用“ i n o d e”有关的各过程。
nami . c,包含“n a m e i”过程,它搜索文件目录。
pipe . c,是“ p i p e”(管道)的“设备驱动程序”,“p i p e”是特殊形式的短磁盘文件,用于从一个进程向另一个进程传输信息。
第五部分 它与低速面向字符的外部设备的输入/输出相关。 共5个
这类设备共享一个公共缓冲池,该缓冲池由一组标准的过程进行管理和操作。
tty. h,定义“ c l i s t”结构(用作字符缓冲队列的队首)和“t t y”结构(存放控制某单个终端的相关数据),说明“ p a r t a b”表(用于控制单个字符向终端的传输),也定义很多相关参数的符号名字。
kl . c,是经K L 11或D L 11接口相连终端的设备驱动程序。
tty. c,包含若干独立于接口的公共过程,它们控制向/从终端的传输,也考虑到各种终端的特殊性。
pc . c,是P C 11纸带阅读/穿孔控制器的设备处理程序。
mem . c,包含一组存取主存的过程,它们将主存视作为普通文件。
最后闲着蛋疼数了一下上面写的这些个文件,就数出来43个,不知道第44个是哪一个。。。。。
只是大概了解下这个森林,下面要好好看看每棵树了。
以上是关于Unix V6 源码阅读的主要内容,如果未能解决你的问题,请参考以下文章
每天看点源码 peertalk —— 一种基于 Unix Domain Socket 的 RPC 方法