私は、あらゆる種類のカーネル開発で初めての試みであり、これに行き詰っています。私のプロジェクトはこれよりも少し複雑ですが、私がこだわっているのは非常に基本的なものです。
ルートディレクトリにいくつかのディレクトリがあり、その中にファイルがある読み取り専用ファイルシステムが必要です。それだけです。それ以上はありません。これをハードコーディングできれば、その場でロードできる限り、後で変更してすべてを動的にするのは簡単なことです。
基本的に、私の質問はこれです:
ファイルシステムを作成して、マウントしてコマンドラインから「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
}
リストされたファイルを取得できる限り、i ノードに基づいて読み取り/オープンを非常に簡単に実装できます。