一:根文件系统(rootfs)
1,rootfs文件系统的注册
在linux kernel初始化阶段会调用int __init init_rootfs(void)向内核注册rootfs文件系统,
init_rootfs()的核心的函数为register_filesystem();这个函数将结构file_system_type?注册在内核一 个单链表中,
- 307 int __init init_rootfs(void)
- 308 {
- 309 int err;
- 311 err = bdi_init(&ramfs_backing_dev_info);
- 312 if (err)
- 313 return err;
- 315 err = register_filesystem(&rootfs_fs_type);
- 316 if (err)
- 317 bdi_destroy(&ramfs_backing_dev_info);
- 319 return err;
- 320 }
- 288 static struct file_system_type rootfs_fs_type = {
- 289 .name = "rootfs",
- 290 .mount = rootfs_mount,
- 291 .kill_sb = kill_litter_super,
- 292 };
2,rootfs_mount()函数解析
static struct dentry *rootfs_mount(struct file_system_type *fs_type, int flags, const char *dev_name, void *data)
rootfs_mount()函数首先会调用mount_nodev()函数,mount_nodev()函数原型如下:mount_nodev(fs_type, flags, data, ramfs_fill_super);
- 1060 struct dentry *mount_nodev(struct file_system_type *fs_type,
- 1061 int flags, void *data,
- 1062 int (*fill_super)(struct super_block *, void *, int))
- 1063 {
- 1064 int error;
- 1065 struct super_block *s = sget(fs_type, NULL, set_anon_super, NULL);
- 1067 if (IS_ERR(s))
- 1068 return ERR_CAST(s);
- 1069
- 1070 s->s_flags = flags;
- 1072 error = fill_super(s, data, flags & MS_SILENT ? 1 : 0);
- 1073 if (error) {
- 1074 deactivate_locked_super(s);
- 1075 return ERR_PTR(error);
- 1076 }
- 1077 s->s_flags |= MS_ACTIVE;
- 1078 return dget(s->s_root);
- 1079 }
上述函数sget()函数的作用主要是分配一个超级快(super_block)的实例,并.通过s_list加入链表super_blocks,然后通过s_instances加入链表typer->fs_supers。
fill_super()函数调用到ramfs_fill_super()函数,ramfs_fill_super()函数的定义如下:
- 209 int ramfs_fill_super(struct super_block *sb, void *data, int silent)
- 210 {
- 211 struct ramfs_fs_info *fsi;
- 212 struct inode *inode;
- 213 int err;
- 215 save_mount_options(sb, data);
- 217 fsi = kzalloc(sizeof(struct ramfs_fs_info), GFP_KERNEL);
- 218 sb->s_fs_info = fsi;
- 219 if (!fsi)
- 220 return -ENOMEM;
- 222 err = ramfs_parse_options(data, &fsi->mount_opts);
- 223 if (err)
- 224 return err;
- 226 sb->s_maxbytes = MAX_LFS_FILESIZE; //文件的最大值
- 227 sb->s_blocksize = PAGE_CACHE_SIZE; //以字节为单位的块的大小
- 228 sb->s_blocksize_bits = PAGE_CACHE_SHIFT; //以位为单位的块的大小
- 229 sb->s_magic = RAMFS_MAGIC;
- 230 sb->s_op = &ramfs_ops; //超级块的方法 ,在处理inode的时候会有用
- 231 sb->s_time_gran = 1;
- 233 inode = ramfs_get_inode(sb, NULL, S_IFDIR | fsi->mount_opts.mode, 0); //建立根目录索引节点
- 234 sb->s_root = d_make_root(inode); //建立根目录目录对象; 超级块的s_root指向刚建立的根目录对象
- 235 if (!sb->s_root)
- 236 return -ENOMEM;
- 238 return 0;
- 239 }
- 54 struct inode *ramfs_get_inode(struct super_block *sb,
- 55 const struct inode *dir, umode_t mode, dev_t dev)
- 56 {
- 57 struct inode * inode = new_inode(sb); //在索引节点高速缓存里创建一个inode,
- 59 if (inode) {
- 60 inode->i_ino = get_next_ino(); //获取一个inode number
- 61 inode_init_owner(inode, dir, mode); //设置inode,初始化uid gid mode等
- 62 inode->i_mapping->a_ops = &ramfs_aops;
- 63 inode->i_mapping->backing_dev_info = &ramfs_backing_dev_info;
- 64 mapping_set_gfp_mask(inode->i_mapping, GFP_HIGHUSER);
- 65 mapping_set_unevictable(inode->i_mapping);
- 66 inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
- 67 switch (mode & S_IFMT) {
- 68 default: //特殊文件;如:字符~块设备文件,FIFO,SOCKET文件
- 69 init_special_inode(inode, mode, dev);
- 70 break;
- 71 case S_IFREG: //普通文件
- 72 inode->i_op = &ramfs_file_inode_operations;
- 73 inode->i_fop = &ramfs_file_operations;
- 74 break;
- 75 case S_IFDIR: //目录文件
- 76 inode->i_op = &ramfs_dir_inode_operations;
- 77 inode->i_fop = &simple_dir_operations;
- 79 /* directory inodes start off with i_nlink == 2 (for "." entry) */
- 80 inc_nlink(inode);
- 81 break;
- 82 case S_IFLNK: //链接文件
- 83 inode->i_op = &page_symlink_inode_operations;
- 84 break;
- 85 }
- 86 }
- 87 return inode; //返回创建的inode与对应的目录项对象关联
- 88 }