虚拟文件系统系列(一)--概述
linux的虚拟文件系统为应用程序提供了一个接口层,可以使用统一的接口操作底层设备和文件,从而也就实现了linux所谓的“万物皆文件”的想法。每种文件所包含的操作不一样,例如目录文件包含lookup函数,而普通文件就没有,设备文件可以通过ioctl操作底层设备。不同的文件系统实现方式也不一样,网络文件系统可以通过网络实现文件读写,缓存同步,等等。。为了为各种文件系统,各种文件提供统一操作,linux给出的方法是抽象出所有文件系统的所有支持的方法,对于特定的文件系统,只需实现本身支持的功能,作为抽象操作的一个子集。当内核使用某个函数前会检查此文件系统是否支持,也就是此函数是否不为空,若不支持内核报错或者通过默认的方式处理,若支持就调用特定文件系统的函数。
linux的虚拟文件系统抽象出三个通用的操作模型,分别用于inode,file和address_space。inode相关的操作处理新建文件、删除、文件属性和目录查找等操作,file相关的操作处理文件的读写等,address_space是文件相关的,每个文件有一个address_mapping,address_space的相关操作用于和内存管理系统之间交互。
struct inode *ext2_iget (struct super_block *sb, unsigned long ino){。。。。if (S_ISREG(inode->i_mode)) { //对于普通文件inode->i_op = &ext2_file_inode_operations;if (ext2_use_xip(inode->i_sb)) {inode->i_mapping->a_ops = &ext2_aops_xip;inode->i_fop = &ext2_xip_file_operations; //file_operations的引用,在open之后传给file对象} else if (test_opt(inode->i_sb, NOBH)) {inode->i_mapping->a_ops = &ext2_nobh_aops;inode->i_fop = &ext2_file_operations;} else {inode->i_mapping->a_ops = &ext2_aops;inode->i_fop = &ext2_file_operations;}} else if (S_ISDIR(inode->i_mode)) { //对于目录文件inode->i_op = &ext2_dir_inode_operations;inode->i_fop = &ext2_dir_operations;if (test_opt(inode->i_sb, NOBH))inode->i_mapping->a_ops = &ext2_nobh_aops;elseinode->i_mapping->a_ops = &ext2_aops;} else if (S_ISLNK(inode->i_mode)) { //对于链接文件if (ext2_inode_is_fast_symlink(inode)) {inode->i_op = &ext2_fast_symlink_inode_operations;nd_terminate_link(ei->i_data, inode->i_size,sizeof(ei->i_data) - 1);} else {inode->i_op = &ext2_symlink_inode_operations;if (test_opt(inode->i_sb, NOBH))inode->i_mapping->a_ops = &ext2_nobh_aops;elseinode->i_mapping->a_ops = &ext2_aops;}} else { //其他类型的特殊文件inode->i_op = &ext2_special_inode_operations;if (raw_inode->i_block[0])init_special_inode(inode, inode->i_mode, old_decode_dev(le32_to_cpu(raw_inode->i_block[0])));else init_special_inode(inode, inode->i_mode, new_decode_dev(le32_to_cpu(raw_inode->i_block[1])));}。。。。。。}