非常简单的Linux VFS实现

时间:2012-12-31 09:12:54

标签: linux kernel vfs

我有点坚持这一点,是我第一次尝试任何类型的内核开发。我的项目比这复杂一点,但我坚持的是非常基本的。

我想要一个只读文件系统,在根目录中包含一些目录,以及其中的文件。就是这样,没有更进一步。如果我能得到这个硬编码,只要我可以动态加载,稍后修改它以使其全部动态是一块蛋糕。

基本上,我的问题是:

如何创建一个文件系统,以便每次我安装它并从命令行调用'ls'时,我会从我的模块中获得一个新的文件列表(现在硬编码,以后会动态拉动)。

我有比这更多的代码,但到目前为止我对此充满信心:

int testfs_super(struct super_block *superblock, void *data, int silent) {
static struct inode_operations inode_operations = {
    .lookup = simple_lookup,
};
struct inode *inode = new_inode(superblock);
struct dentry *root;
save_mount_options(superblock, data);
superblock -> s_op = &testfs_ops;
/*
superblock -> s_maxbytes = 10000000;
superblock -> s_blocksize = PAGE_SIZE;
superblock -> s_blocksize_bits = PAGE_SHIFT;*/
inode -> i_ino = 0;
inode_init_owner(inode, NULL, S_IFDIR | testfs_DIRECTORY_MODE);
inode -> i_op = &inode_operations;
inode -> i_fop = &simple_dir_operations;
root = d_make_root(inode);
if (!root) {
    return -ENOMEM;
}
superblock -> s_root = root;
return 0;
}

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

详细说明,我想要结束的是这样的:

? list_files(inode* dir) {
  item1 = inode and dentry with id of 1 and random name
  item2 = inode and dentry with id of 2 and random name
  item3 = inode and dentry with id of 3 and random name
}

只要我能够获得列出的文件,我就可以很容易地实现基于inode的读/打开。

0 个答案:

没有答案