2 FreeBSD 核心

FreeBSD核心探讨.5.驱动程序篇

2.2 虚拟文件系统和v-node
FreeBSD在disk上的除了ffs以外还可以操作各种各样的文件系统 。主要的如
下:
。cd9660
可以对ISO9660形式的cd-rom的目录/文件构造的文件系统进行mount,
locate等目录层的操作
。ms-Dos
对ms-dos文件系统进行目录层次的mount,定位等操作
。mfs
通过使用虚拟内存对swap区的一部分进行Unix文件系统的构造,定位
作为目录的一部分进行读写
。nfs
由nfs server提供的remote目录级进行mount,定位的目录层操作 。
。null
对已经存在的目录层的使用别名
。union
对已有的目录A(上层)在下层目录B上进行重叠 (不大理解这的意思
,大概是在下层目录里面又嫁接了上层目录的意思:译者) 。文件名的查
找由上层优先进行 。没有的话就转道下层 。如果对下层的文件进行写操作
,它的拷贝就在上层上进行 。举例说明,作业目录在上层,但cd-rom的源
在下层,两个目录重叠,那么编译source的时候,就相当方便了 。
。procfs
对于进程号的目录作成mount point 。通过文件名对各个目录的进程进行
控制 。
。kernfs
为了对动作中的kernel有关的信息进行参考,而作成的mount point
。fdesc
对于各个进程,用它所打开的文件柄对应的文件作成的mount point

实际上,在核心内部,为了对它们进行统一操作,就对文件系统和v-node
进行抽象化,实际的处理过程就是调用各类的文件系统的模块进行处理 。

2.2.1对虚拟文件系统的操作
各个文件系统可以提供的操作的一览如下,它在struct vfsops
(@sys/mount.h)里面定义:
。对文件系统进行mount的操作
。本文件系统的开始动作的操作
。本文件系统的umount操作
。表达文件系统的根的v-node的查找操作
。对一般用户的权限控制
。取得文件系统的状态
。内存内的管理信息写入介质中
。从i-node到v-node的取得操作
。v-node和nfs的文件柄的相互变换的操作
。文件系统实际的模块的初始化

对于文件系统,各个实际的操作routine在vfsops的形式提供准备工作 。各个文件系
统的vfsops,在以下的表里的source进行定义:

--------------------------------------------------------------
file system vfsops的定义 source
--------------------------------------------------------------
ufs ufs_vfsops ufs/ffs/ffs_vfsops.c
cd9660 cd9660_vfsops isofs/cd9660/cd9660_vfsops.c
msdos msdosfs_vfsops msdosfs/msdosfs_vfsops.c
mfs mfs_vfsops ufs/mfs/mfs_vfops.c
nfs nfs_vfsops nfs/nfs_vfsops.c
null null_vfsops miscfs/nullfs/null_vfsops.c
nuion union_vfsops miscfs/union/union_vfsops.c
procfs procfs_vfsops miscfs/procfs/procfs_vfsops.c
kernfs kernfs_vfsops miscfs/kernfs/kernfs_vfsops.c
fdesc fdesc_vfsops miscfs/fdesc/fdesc_vfsops.c
devfs devfs_vfsops miscfs/devfs/devfs_vfsops.c
ext2fs ext2fs_vfsops gnu/ext2fs/ext2_vfsops.c
lfs lfs_vfsops ufs/lfs/lfs_vfsops.c
portal portal_vfsops miscfs/portal.portal_vfsops.c
umap umap_vfsops miscfs/umapfs/umap_vfsops.c
---------------------------------------------------------------
这些就是文件系统的实际模块(*_vfsops.c),文件系统名称,文件系统号等等
在struct vfsconf(@sys/mount.h)里面汇总,各个模块里用宏VFS_SET()进入核
心 。
根据main()(@kern/init_main.c),在kernel初始化的过程中,vfsinit()
(@kern/vfs_init.c)里面有
struct vfsconf *vfsconf[MOUNT_MAXTYPE 1];
struct vfsops *vfssw[MOUNT_MAXTYPE 1];
各种东西的设定,这些是,管理mount信息的struct mount(@sys/mount.h)的成员
mnt_vfc和mnt_op要指定所对应的文件系统的vfsconf,vfssw 。还有宏VFS_操作名
(struct mount *,..)里,可以各个操作的调用 。

推荐阅读