文件系统的操作
l 注册文件系统
² 文件系统信息用struct file_system_type来描述。
² fs/super.c中register_filesystem注册文件系统。
l 装载和卸载文件系统
² 文件系统的装载由mount系统调用发出。
² UNIX使用单一的文件系统层次描述,新的文件系统集成到其中(mount到这个文件系统中)。
² 装载点:原来的文件系统的一个目录,用来挂载新的文件系统。挂载后,该目录的内容变成新文件系统的根目录的内容,原有内容消失直到被挂载的文件系统卸载。装载可以嵌套。
² 每个装载的文件系统都对应一个struct vfsmount结构体。该结构体描述了父文件系统,挂载点的dentry,指向超级块的指针
² 装在操作开始于读取超级块。超级块用struct super_block来描述。其中记录了块大小、文件系统一般类型信息、指向全局根目录的dentry、记录脏inode的链表表头、记录打开的文件的链表、以及struct super_operation(其中包含了丰富的函数:对inode的操作函数---标记为脏、读取、删除;对超级块的操作;对文件系统的操作)。
l mount unmount系统调用,自动过期(定时自动卸载),伪文件系统(ramfs tmpfs procfs sysfs)
文件的操作
l 查找inode
² 一个常见的文件操作是根据文件名查找inode(文件名àinode)。
struct nameidata结构体用来记录查找结果。
struct nameidata {
struct dentry *dentry; //找到的结果dentry
struct vfsmount *mnt; //找到的结果vfsmount
struct qstr last; //要查找的文件名
unsigned int flags;
...
}
² 内核使用path_lookup查找路径或文件名。
int fastcall path_lookup( const char *name, unsigned int flags,
struct nameidata *nd)
l 打开文件
² 得到一个未被使用的fd。
² do_filp_namei:调用path_lookup查找文件名对应的inode;nameidata_to_flip初始化预读结构。
² 将fd填入task_struct中fd[]数组。
l 读取和写入(读写类似)
² 函数fget_light根据fd找到struct file。
² 函数file_pos_read返回f_pos。
² vfs读取:f_op->read或者do_sync_read(缺省标准例程)
² 更新f_pos。
读写操作的难点在于Linux系统中精细复杂的缓冲区和缓存系统。