发信人: liangvy()
整理人: hahalee(1999-03-22 08:31:19), 站内信件
|
翻译:liangvy [email protected] icewolf.leon :-) 版权所有,可以转贴
第二章 文件系统和设备驱动程序
这章主要介绍文件系统和特殊的设备文件以及它们的对应关系。
2。1 disk上的 unix file system 的基本知识 首先介绍一下经典的unix file system的思维方法。 disk 的 partition就是从0到512byte的连续长度的block的东西。这里有 1.file/directory有关的固定长度的信息,i-node 2.file/directory的本体,data block 的两样不同的东西。partition的前面的附近块(block#16 ,1--15用于boot program :-))就是i-node,data block用的领域等等的开始位置(block号) 和长度(block数量)等的记录,叫做super-block。一个block可能的容量只 能有固定数目的i-node,所以如果分配了固定的i-node,收录了节点号和节 点的块号和块的位置就可以计算出来。 i-node就是 。表明i-node的种类(file ,direstory,device等) 。这个节点参考的次数(目录数) 。参考,作成,变化的时间 。权限 。所有者的user id / group id 。本体的长度 。收集本体的data block的block号码的固定长度的对应表 的一些记录。因为data block的对应表是固定的关系,比 如10个,最长就能够作出512*10=5k为止的file。
当文件比块大的时候,unix就采用成组联结的方式对它们进行管理。就是 把所有的空闲块以一定数目为一组的方法作成单向空闲块stacker。 特别地,文件的从先头的byte位置开始和i-node内的对应表有着密切的关系。 而且,对于i-node的输入输出,可以对应指定位置的数据块进行读写。重要 的是,核心可以依照这个管理表对io装置进行管理。 unix对io设备的操作也是作为(特殊)文件进行的。对于用i-node进行 描述的io设备,data block数据块的对应表就没必要了。这个部分的io设备 的识别就通过device号码来进行。向这些对i-node进行输入输出处理的, 就又设备驱动号区别,来进行device driver驱动。 那么,节点怎么的进行查找呢?partition的最初的目录(根目录)就是, 从第二个i-node开始,一个一个顺着节点进行查找。 比如,对于目录/uuu/vvv/.../yyy/zzz的查找方式,有这种关系: 。i-node #2 所存放的是root directory。读入它的本体,就可以找到 相应的uuu所对应的i-node。 。读入这个i-node所存放的directory的i-node本体,找到相应的vvv节点。 ...... 查找对应yyy的节点 。读入这个节点的本体信息,这里包含目录本题的内容,这样就可以找到 zzz所对应的i-node。 目录里面由于记录了对应文件名的节点号,所以,也有可能同一个节点号 根据文件名不一样,就可以找到不同的目录名。这就是硬连接(hard link). 但是,节点号有只存在于节点所在的分区的含义,所以,不同的分区, 这种硬连接就不具有存在的可能性。为了解决这个矛盾,就有了符号连接 (symble link)的说法。当节点是输入符号连接的时候,符号连接就包含 了这个节点的data block所指定的路径名。但是,空连接和loop连接这种 情况也是允许的,所以核心要指定循环连接的最大次数。具体由参数 MAXSYMLINKS(@sys/param.h)指定。 这样,多个分区建立一个文件系统就有可能了。启动核心的分区作为一个 已存的文件系统,其他的分区就嫁接到目录层上面。这个操作过程就是mount。 利用mount指令,就可以实现上面的操作。但是,mount之前的目录,在mount后 就给屏蔽了,直到mount结束,那些目录就可以再现。 以上就是经典的unix文件系统理论。但是,对于读入了i-node,就去读 data block ,这种情况,对于一个比较大的分区,硬盘磁头向disk head的距 离就太大了。总的来说,访问时间就会变长。在这里有一些指导思想: 。分区要比较小,多分小区 。了解超级块的地位,超级块记录了分区的信息,考虑由于介质的原因而 使这个超级块造成损害,所以,在分区内部就必须为它准备多几个拷贝。 。目录和它下层的文件,要在相同的领域内放置。 。确保单位data block要比磁盘的block大。 考虑了一些东西后,经过改良标准,freebsd就采用一个叫做FFS的文件系 统(Fast File System),但这只是i-node领域/data领域的配置方法的变化,基 本的考虑方法并没有变。对磁盘分区进行文件系统的构造的初始化由命令newfs 提供。看看它的source就知道怎么配置的了。其他的构造(......)对应于kernel 的source,对于构成boot program的文件disk.c和sys.c(@i386/boot/biosboot) 比较简单易懂(单纯性)。 上面讲述的i-node对disk的partition的记录形式,详细的(source)在 struct dinode(@ufs/ufs/dinode.h)里面有。在核心内部使用的,包含这个东西 的是struct inode(@ufs/ufs.inode.h)。
描述io设备的文件叫特殊文件(special file),他对应的i-node有两个种 类: 。块型(block) 和装置的固有的数据记录的单位(大多数的情况是512byte)无关。读写 的最小单位是1byte,可以在任意的场所里任意长度的data。核心对各个 block型的特殊文件进行固定的记录单位长度(倍数)进行缓冲(buffer) 管理,这样就可以处理任意长度的读写了. 。文字型(char) 读写的基本单位是,受到装置固有的date记录单位长的限定。没有block 型的缓冲管理,对应于装置的物理特性,读写属于专用。或者说,是读写 两用。 除了网络接口之外,io装置可以全部分为文字型和块型两个大类。总的来说, 磁盘操作的两样都用,但其他的io装置只有文字型。还有就是一些没对应物理设 备的kernel modules提供的虚拟设备也有,它们对应着文字型的特殊文件。特殊 文件习惯放在目录/dev里面。
对于特殊设备文件的i-node有block和chat两个类,设备通过驱动号进行记录 。通过这些,就可以识别device driver。device 号就是major号(8bit)(主设备 号)和minor号(24bit)(辅助设备号),device driver的识别就是由major的不 一样而区别。而且呢,block型,char型的等等可能存在最大数目是256种类。一般的 情况,同种类的设备不同数目的区别就是通过辅助设备号进行识别。实际上,对于 disk的特殊文件,有disk/slide/partition表示法,而且,文字型,块型等的特殊 设备文件也存在。以下就是一个ide硬盘的的文字型特殊设备文件的例子: /dev/rwd0 1台ide的硬盘 /dev/rwd0s1 1台ide的硬盘的slide #1 /dev/rwd0s2 1台ide的硬盘的slide #2 /dev/rwd0s2a slide #2的partition a /dev/rwd0s2b slide #2的partition b ... /dev/rwd0s3 1台的ide的硬盘的slide #3
如果把rwd换成wd,对应的就是block型的特殊设备文件了。 对于磁盘,有如下的使用方法: 。对于slide的文字型特殊文件 读写disk label时候使用(disklabel command) 。对于对应的partition的文字型特殊文件 在分区上建立unix文件系统时候(newfs command),文件系统修复, 检查(fsck)时候使用 。对于partition的block型的特殊文件 作为mount命令的参数使用 (下一节介绍虚拟文件系统和v-node,要休息了:-) )
-- Welcome to SuSE Linux 6.0 (i386) - Kernel 2.2.3 (tty1) liangvy # uname -a Linux liangvy.icewolf.leon 2.2.3 #12 Sun Mar 14 20:38 CST 1999 i686 unknown
-- ※ 来源:.网易 BBS bbs.netease.com.[FROM: www2.dt.sanyo.co.jp]
|
|