2 FreeBSD 核心( 二 )



2.2.2对v-node的操作
虚拟文件系统就是通过对i-node的抽象化之后的v-node的文件/目录进行io处理 。
为了这个目的,作为对v-node的适用处理,有
。从v-node到文件名的查找,返回v-node
。打开/关闭v-node
。检查是否可能访问v-node
。得到-v-node的属性
。设定v-node的属性
。对v-node的输入/输出
。扩展v-node的硬连接和符号连接
。对v-node进行目录的作成和删除
。。。。
由这里开始,一共定义了41个 。
v-node由struct vnode(@sys/vnode.h)里定义,作为类别在enum vtype
里面表示出来,一共是9种类 。它包含着在各个文件系统上对各个的文件/目录(包
括特殊)文件进行统一识别的信息 。为了实现这样,v-node一连串的操作就是在各
模块里通过宏VNODEOP_SET()和核心通讯 。这些操作名和实现的routine只需要必要
的几个对应 。在核心初始化里,vfs_opv_init()(@kern/vfs_init.c)就使从数据得
到的号码一一对应,收集了routine的地址的同一size的配列再进行组合 。各个
v-node就一个一个指向这些配列 。对v-node的操作在vnode_if.h里定义:
它以
VOP_操作名(v-node,...)
的统一形式记述 。

下面是对v-node的操作的定义source:
------------------------------------------------------------------------
各个v-node操作(vnodeopv) source
------------------------------------------------------------------------
cd9660_fifoop_opv_desc isofs/cd9660/cd9660_vnops.c
cd9660_specop_opv_desc isofs/cd9660/cd9660_vnops.c
cd9660_vnodeop_opv_desc isofs/cd9660/cd9660_vnops.c
dead_vnodop_opv_desc miscfs/deadfs/dead_devfs_vnops.c
devfs_vnodeop_desc miscfs/devfs/devfs_vnops.c
ext2fs_fifoop_opv_desc gnu/ext2fs/ext2fs_vnops.c
ext2fs_specop_opv_desc gnu/ext2fs/ext2fs_vnops.c
ext2fs_vnodeop_opv_desc gnu/ext2fs/ext2fs_vnops.c
fdesc_vnodeop_opv_desc miscfs/fdesc/fdesc_vnops.c
ffs_fifoop_opv_desc ufs/ffs/ffs_vnops.c
ffs_specop_opv_desc ufs/ffs/ffs_vnops.c
ffs_vnodeop_opv_desc ufs/ffs/ffs_vnops.c
fifo_nfsv2nodeop_opv_desc nfs/nfs_vnops.c
fifo_vnodeop_opv_desc miscfs/fifofs/fifo_vnops.c
kernfs_vnodeop_opv_desc miscfs/kernfs/kernfs_vnops.c
lfs_fifoop_opv_desc ufs/lfs/lfs_vnops.c
lfs_specop_opv_desc ufs/lfs/lfs_vnops.c
lfs_vnodeop_opv_desc ufs/lfs/lfs_vnops.c
mfs_vnodeop_opv_desc ufs/mfs/mfs_vnops.c
msdosfs_vnodeop_opv_desc msdosfs/msdosfs_vnops.c
nfsv2_vnodeop_opv_desc nfs/nfs_vnops.c
null_vnodeop_opv_desc miscfs/nullfs/null_vnops.c
portal_vnodeop_opv_desc miscfs/portal/portal_vnops.c
procfs_vnodeop_opv_desc miscfs/procfs/procfs_vnops.c
spec_nfsv2nodeop_opv_desc nfs/nfs_vnops.c
spec_vnodeop_opv_desc miscfs/specfs/spec_vnops.c
umap_vnodeop_opv_desc miscfs/umapfs/umap_vnops.c
union_vnodeop_opv_desc miscfs/union/union_vnops.c
------------------------------------------------------------------------
这个基础上,spec_vnodeop_opv_spec里描述的操作群就是device driver
interface的东西!!

( 本小节完,待本岛主有空再继续 )



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

2.3 mount根目录之前的处理概要
mount根目录的时候,main()(@kern/init_main.c)的初始化的过程从xxx_vfs_mountroot()
(@kern/init_mail.c)被调用开始 。如果处理过程正常,就对rootvp设定包含了root的
v-node 。
。main()的初始化过程中,configure()(@autoconf.c)被调用 。在这个,io设备
初始化完了后,就转移到如下两个变量的地址:一个是mountroot,是处理mount的routine,
另一个是mountrootvfsops,是处理虚拟文件系统的routine 。在本机磁盘中,就进入变量
rootdev所指定的disk号中 。这里就是,假定本机磁盘
mountroot vfs_mountroot
mountrootvfsop &ufs_vfsops
rootdev boot disk number

。xxx_vfs_mountroot()(@kern/init_main.c)

推荐阅读