我有点坚持这一点,是我第一次尝试任何类型的内核开发。我的项目比这复杂一点,但我坚持的是非常基本的。
我想要一个只读文件系统,在根目录中包含一些目录,以及其中的文件。就是这样,没有更进一步。如果我能得到这个硬编码,只要我可以动态加载,稍后修改它以使其全部动态是一块蛋糕。
基本上,我的问题是:
如何创建一个文件系统,以便每次我安装它并从命令行调用'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的读/打开。