从300行代码来看文件系统建立

在这里插入图片描述
有位作者用300多行代码开发了一个小的文件系统,那通过这段代码来简单理解一下文件系统。代码可以到这里看到:https://mp.weixin.qq.com/s/Sidfn8CZn4KxKh6xMH2uJQ
没有使用真实的硬件介质,用内存模拟介质。

注册自己的文件系统

要让系统识别到自己的系统,先要按要求向系统注册。

struct file_system_type tinyfs_fs_type = {
	.owner = THIS_MODULE,
	.name = "tinyfs",
	.mount = tinyfs_mount,
	.kill_sb = tinyfs_kill_superblock,
};

可以看到结构体中主要就是向VFS提供了mount和kill_sb回调函数。用来实现文件系统的挂载与解挂载。
通过声明并填充file_system_type结构体,然后向系统进行注册该文件系统,注册后会被链入系统的一个单链表file_systems中。

static int tinyfs_init(void)
{
	int ret;
	memset(block, 0, sizeof(block));
	ret = register_filesystem(&tinyfs_fs_type);   //注册
	if (ret)
		printk("register tinyfs failed\n");
	return ret;
}
static void tinyfs_exit(void)
{
	unregister_filesystem(&tinyfs_fs_type);  //注销
}

挂载初始化

超级块是整个文件系统元数据的容器,装载文件系统时,文件系统初始化,开始构建超级块super_block。
仅仅有超级块还不够,超级块存放的是元数据,还需要创建文件系统的根节点、根节点对应的dentry。

int tinyfs_fill_super(struct super_block *sb, void *data, int silent)
{
	struct inode *root_inode;
	int mode = S_IFDIR;
	root_inode = new_inode(sb); //获取一个新inode
	root_inode->i_ino = 1;   //inode编号
	inode_init_owner(root_inode, NULL, mode);
	root_inode->i_sb = sb;
	root_inode->i_op = &tinyfs_inode_ops;  //指向inode操作表的指针
	root_inode->i_fop = &tinyfs_dir_operations;  //指向文件操作表的指针
	root_inode->i_atime = root_inode->i_mtime = root_inode->i_ctime = CURRENT_TIME;
	block[1].mode = mode;
	block[1].dir_children = 0;
	block[1].idx = 1;
	block[1].busy = 1;
	root_inode->i_private = &block[1];
	sb->s_root = d_make_root(root_inode);  //指向文件系统根目录的dentry
	curr_count ++;
	return 0;
}

static struct dentry *tinyfs_mount(struct file_system_type *fs_type, int flags, const char *dev_name, void *data)
{
	return mount_nodev(fs_type, flags, data, tinyfs_fill_super);
}

inode包含了文件系统各种对象的元数据。

操作函数集

实现函数操作集,则可以简单运行起来了

const struct file_operations tinyfs_file_operations = {
	.read = tinyfs_read,
	.write = tinyfs_write,
};

const struct file_operations tinyfs_dir_operations = {
	.owner = THIS_MODULE,
	.readdir = tinyfs_readdir,
};

static struct inode_operations tinyfs_inode_ops = {
	.create = tinyfs_create,
	.lookup = tinyfs_lookup,
	.mkdir = tinyfs_mkdir,
	.rmdir = tinyfs_rmdir,
	.unlink = tinyfs_unlink,
};

参考资料

《存储技术原理分析–基于Linux2.6内核源代码》

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值