[文件系统]文件系统学习笔记(九)---rootfs

一:根文件系统(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 }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值