发信人: liangvy()
整理人: hahalee(1999-04-26 17:24:09), 站内信件
|
[译者:Lenn<[email protected]>] [版权所有,不得书面出版]
2。2。5系统调用open()的处理概要 进程通过系统调用read()/write()进行io处理,它由文件描述符指定对哪里进 行i/o,文件描述符是0以上的整数,它在各个进程的struct proc的成员 struct filedesc *p_fd(struct filedesc(@sys/filedesc.h))保留的struct file ((@sys/file.h)进行选择添加。对struct file,它含有从文件的头的输入输出的byte 位置,输入操作,输出操作,输入输出控制,输入输出的准备状态的检查,执行close 的routine,以及描述io处理对象的信息(v-node,socket,pipe) 。系统调用open() (@kern/vfs_syscalls.c)就是把包含路径信息的v-node找寻出来,为了对它进行io处理, 先要对struct file进行初始化,然后返回文件描述符。 从路径名查找v-nodehe和io准备操作由vn_open()(@kern/vfs_vnops.c)承担。 vn_open()通过namei()(@kern/vfs_lookup.c)查找路径对应的v-node名,由VOP_OPEN() 调用不同的v-node定义的准备过程routine。例如,有如下的处理方法。 。普通的file/directory 调用ufs_open()(@ufs/ufs/ufs_vnops.c),检查open的mode 。特殊设备文件 调用spec_open()(@miscfs/specfs/spec_vnops.c) 文字型 调用device driver的open routine 快型 mount的时候出错。如果不是这样,就调用device driver的 open routine。
回过头来,namei()的任务是就是,对于指定的路径名,对应于跟目录或者当 前目录的v-node作为起点,通过lookup()(@kern/vfs_lookup.c)进行v-node查找。 lookup()从路径名开始的v-node(VDIR)开始查找。找到了的v-node作为新的起点继续进行 查找下一步的要素名,然后得到目的的v-node。这个时候,根据v-node的不同,目录的检 索方法也就不同。各个要素的实际检索由VOP_LOOKUP()来做。
2。2。6系统调用read()的处理概要 open()取得文件描述符后,对它的输入处理,有如下的流程。指定的文件描述符 的struct file内登记的处理routine有vn_read()(@kern/vfs_vnops.c),vn_write(), vn_ioctl(),vn_select(),vn_closefile(),v_node 登记的操作routine不能分开使用。vn_*()里,只有在合适的前缀操作下,才能正确调用。 read()首先在struct uio(@sys/uio.h)登记进程指定的buffer的位置和长度。 执行read()后,vn_read()向struct file设定登记的文件的读写位置,然后调用VOP_READ()。 根据读出来的byte数,读写位置相应增加。 VOP_READ()的call routine则是与v-node有关,就象下图一样。
vn_read() 文字型/块型 | /------------------ | | file/directory spec_read() ---------ffs_read()-------VOP_READ() block型 | | /---------------|char型 | bread() device driver bread() | | spec_strategy() ---------------ufs_strategy() --VOP_STRATEGY() | | | | | | device driver spec_strategy() -------------/ | | device driver
。普通的file/directory 调用ffs_read()(@ufs/ufs/ufs_readwrite.c)。对应指定的读写位置,计算block 的位置,然后用bread()读出来。读出来的数据送到进程所准备的缓冲区。从bread() 传递过来的block并不是物理block的位置,而是把file作为block列的一个理论值。 从理论块到物理块的变换由VOP_STARATEGY()完成。也就是说,ufs_strategy()先把 文件内位置转化为物理block位置,然后从v-node记录的i-node把表示物理设备的 v-node 去出来,这个VOP_STRATEGY就调用spec()(@miscfs/specfs/spec_vnops.c) 让它进行输入要求。 。特殊设备文件 通过调用spec_read()(@miscfs/specfs/spec_vnops.c),把它分为文字型和块型两类。 文字型 调用device driver的输入routine 块型 通过bread()进行输入处理
对文件的系统调用write()的场合也是类似的处理流程(ufs_write()->bwrite()), ufs_write()则要考虑到文件大小的延伸。
--
Lenn
[email protected]
Oicq: Lenn 28663
※ 来源:.网易 BBS bbs.netease.com.[FROM: www2.dt.sanyo.co.jp]
|
|