2

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

我想要一个只读文件系统,在根目录中有一些目录,以及其中的文件。就是这样,没有别的了。如果我能得到这个硬编码,那么以后修改它以使其全部动态化将是小菜一碟,只要我可以即时加载。

基本上,我的问题是:

如何创建一个文件系统,以便每次挂载它并从命令行调用“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 的读取/打开。

4

0 回答 0