分类: LINUX
2009-04-18 19:54:14
struct super_block { //超级块数据结构 struct list_head s_list; /*指向超级块链表的指针*/ …… struct file_system_type *s_type; /*文件系统类型*/ struct super_operations *s_op; /*超级块方法*/ …… struct list_head s_instances; /*该类型文件系统*/ …… }; struct super_operations { //超级块方法 …… //该函数在给定的超级块下创建并初始化一个新的索引节点对象 struct inode *(*alloc_inode)(struct super_block *sb); …… //该函数从磁盘上读取索引节点,并动态填充内存中对应的索引节点对象的剩余部分 void (*read_inode) (struct inode *); …… }; |
struct inode {//索引节点结构 …… struct inode_operations *i_op; /*索引节点操作表*/ struct file_operations *i_fop; /*该索引节点对应文件的文件操作集*/ struct super_block *i_sb; /*相关的超级块*/ …… }; struct inode_operations { //索引节点方法 …… //该函数为dentry对象所对应的文件创建一个新的索引节点,主要是由open()系统调用来调用 int (*create) (struct inode *,struct dentry *,int, struct nameidata *); //在特定目录中寻找dentry对象所对应的索引节点 struct dentry * (*lookup) (struct inode *,struct dentry *, struct nameidata *); …… }; |
struct dentry {//目录项结构 …… struct inode *d_inode; /*相关的索引节点*/ struct dentry *d_parent; /*父目录的目录项对象*/ struct qstr d_name; /*目录项的名字*/ …… struct list_head d_subdirs; /*子目录*/ …… struct dentry_operations *d_op; /*目录项操作表*/ struct super_block *d_sb; /*文件超级块*/ …… }; struct dentry_operations { //判断目录项是否有效; int (*d_revalidate)(struct dentry *, struct nameidata *); //为目录项生成散列值; int (*d_hash) (struct dentry *, struct qstr *); …… }; |
struct file { …… struct list_head f_list; /*文件对象链表*/ struct dentry *f_dentry; /*相关目录项对象*/ struct vfsmount *f_vfsmnt; /*相关的安装文件系统*/ struct file_operations *f_op; /*文件操作表*/ …… }; struct file_operations { …… //文件读操作 ssize_t (*read) (struct file *, char __user *, size_t, loff_t *); …… //文件写操作 ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *); …… int (*readdir) (struct file *, void *, filldir_t); …… //文件打开操作 int (*open) (struct inode *, struct file *); …… }; |
struct file_system_type { const char *name; /*文件系统的名字*/ struct subsystem subsys; /*sysfs子系统对象*/ int fs_flags; /*文件系统类型标志*/ /*在文件系统被安装时,从磁盘中读取超级块,在内存中组装超级块对象*/ struct super_block *(*get_sb) (struct file_system_type*, int, const char*, void *); void (*kill_sb) (struct super_block *); /*终止访问超级块*/ struct module *owner; /*文件系统模块*/ struct file_system_type * next; /*链表中的下一个文件系统类型*/ struct list_head fs_supers; /*具有同一种文件系统类型的超级块对象链表*/ }; struct vfsmount { struct list_head mnt_hash; /*散列表*/ struct vfsmount *mnt_parent; /*父文件系统*/ struct dentry *mnt_mountpoint; /*安装点的目录项对象*/ struct dentry *mnt_root; /*该文件系统的根目录项对象*/ struct super_block *mnt_sb; /*该文件系统的超级块*/ struct list_head mnt_mounts; /*子文件系统链表*/ struct list_head mnt_child; /*子文件系统链表*/ atomic_t mnt_count; /*使用计数*/ int mnt_flags; /*安装标志*/ char *mnt_devname; /*设备文件名*/ struct list_head mnt_list; /*描述符链表*/ struct list_head mnt_fslink; /*具体文件系统的到期列表*/ struct namespace *mnt_namespace; /*相关的名字空间*/ }; |
struct files_struct {//打开的文件集 atomic_t count; /*结构的使用计数*/ …… int max_fds; /*文件对象数的上限*/ int max_fdset; /*文件描述符的上限*/ int next_fd; /*下一个文件描述符*/ struct file ** fd; /*全部文件对象数组*/ …… }; struct fs_struct {//建立进程与文件系统的关系 atomic_t count; /*结构的使用计数*/ rwlock_t lock; /*保护该结构体的锁*/ int umask; /*默认的文件访问权限*/ struct dentry * root; /*根目录的目录项对象*/ struct dentry * pwd; /*当前工作目录的目录项对象*/ struct dentry * altroot; /*可供选择的根目录的目录项对象*/ struct vfsmount * rootmnt; /*根目录的安装点对象*/ struct vfsmount * pwdmnt; /*pwd的安装点对象*/ struct vfsmount * altrootmnt;/*可供选择的根目录的安装点对象*/ }; |
struct nameidata { struct dentry *dentry; /*目录项对象的地址*/ struct vfsmount *mnt; /*安装点的数据*/ struct qstr last; /*路径中的最后一个component*/ unsigned int flags; /*查找标识*/ int last_type; /*路径中的最后一个component的类型*/ unsigned depth; /*当前symbolic link的嵌套深度,不能大于6*/ char *saved_names[MAX_NESTED_LINKS + 1];/ /*和嵌套symbolic link 相关的pathname*/ union { struct open_intent open; /*说明文件该如何访问*/ } intent; /*专用数据*/ }; |
void ext3_read_inode(struct inode * inode) { …… //是普通文件 if (S_ISREG(inode->i_mode)) { inode->i_op = &ext3_file_inode_operations; inode->i_fop = &ext3_file_operations; ext3_set_aops(inode); } else if (S_ISDIR(inode->i_mode)) { //是目录文件 inode->i_op = &ext3_dir_inode_operations; inode->i_fop = &ext3_dir_operations; } else if (S_ISLNK(inode->i_mode)) { // 是连接文件 …… } else { // 如果以上三种情况都排除了,则是设备驱动 //这里的设备还包括套结字、FIFO等伪设备 …… } |
static struct file *__dentry_open(struct dentry *dentry, struct vfsmount *mnt, int flags, struct file *f, int (*open)(struct inode *, struct file *)) { struct inode *inode; …… //整个函数的工作在于填充一个file对象 …… f->f_mapping = inode->i_mapping; f->f_dentry = dentry; f->f_vfsmnt = mnt; f->f_pos = 0; //将对应的索引节点的文件操作函数集赋予文件对象的操作列表 f->f_op = fops_get(inode->i_fop); …… //若文件自己定义了open操作,则执行这个特定的open操作。 if (!open && f->f_op) open = f->f_op->open; if (open) { error = open(inode, f); if (error) goto cleanup_all; …… return f; } |