Linux 版 (精华区)
发信人: tcpip (俺的昵称改了), 信区: Linux
标 题: FreeBSD核心探讨.4.驱动程序篇(转寄)
发信站: 哈工大紫丁香 (Tue Aug 24 16:44:33 1999), 转信
发信人: reden (Offer 快快来啊 ~!), 信区: FreeBSD
标 题: FreeBSD核心探讨.4.驱动程序篇
发信站: BBS 水木清华站 (Mon Mar 29 19:48:30 1999)
标 题: FreeBSD核心探讨.4.驱动程序篇
作 者: liangvy (桃花岛主) 1999.03.22
翻译:liangvy liangvy@bigfoot.com 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.net.tsinghua.edu.cn·[FROM: 159.226.21
.168]
--
☆ 来源:.哈工大紫丁香 bbs.hit.edu.cn.[FROM: bin@mtlab.hit.edu.cn]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:6.933毫秒