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)
页面执行时间:3.738毫秒