有位作者用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内核源代码》
版权声明:本文为Angel_94原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。