我正在为课堂作业编写一个 Linux 内核模块,但遇到了一些令人费解的问题。
首先,模块在
/proc/
下创建一个文件夹,并在该文件夹下创建一个文件 /proc/folder/file
。
实现基本上是这样的:
static struct proc_dir_entry* parent;
static struct proc_dir_entry* file;
// ...
int __init mod_init(void) {
parent = proc_mkdir("folder", NULL);
if(parent == NULL) {
return -ENOMEM;
}
file = proc_create("file", 0666, parent, &fops);
if(file == NULL) {
return -ENOMEM;
}
pr_info("Module insertion successful.\n");
return 0;
}
现在该模块遇到了几个问题。首先,如果文件/文件夹已经存在,则返回-ENOMEM并指出分配内存失败后无法插入模块。我宁愿能够区分实际上无法创建指向 procfile 的指针,而不是无法覆盖它,我想知道如何做到这一点。
接下来,我删除该模块并尝试删除我制作的文件和文件夹:
void __exit mod_exit(void) {
proc_remove(file);
proc_remove(folder);
}
// (And then I bind the insert/exit functions)
现在(假设之前的代码工作正常),这个函数可以正常工作,没有错误。但是,它只删除子文件,并没有删除文件夹,这违背了预期的功能,所以
/proc/
仍然包含/parent
TL;博士:
大多数其他代码都是相当任意的样板代码,它们已经按预期工作,并且主要是针对我的任务的。我只是不知道如何让它工作,因为我在网上找到的任何文档都没有涵盖这个特定的问题(或者谷歌只是不起作用。)
编辑: 我忘了提及,使用 proc_create 和
parent
作为父条目也不起作用,因为 proc_mkdir 返回 NULL。有没有办法简单地获取指向现有文件夹的指针?
我在 Ubuntu 20.04 LTS 上使用内核
6.8.0-48-generic
。
好吧,事实证明有一个单独的函数
proc_remove_subtree()
专门用于删除 /proc 目录及其子目录,这样就解决了这两个问题。我仍然没有办法区分失败的文件和现有文件,但这消除了检查的需要,因为它们保证在删除模块后被删除。