内核模块中能否在根路径创建目录?我的实现为何导致终端冻结?
内核模块中创建根路径目录的问题解析
首先明确回答:完全可以在内核模块中于根路径创建目录,但你的实现方式存在关键错误,这正是导致模块插入时终端冻结的原因。
你的代码问题所在
你使用filp_open并搭配O_CREAT标志试图创建目录,这是核心错误:
filp_open的设计目标是打开已存在的文件或目录,而非创建目录。O_CREAT标志仅对普通文件有效,对目录完全不起作用。当你用这个组合去打开一个不存在的目录时,内核无法正确处理这个非法操作,进而引发内部异常(比如死锁或未处理的错误路径),最终导致终端冻结、模块插入失败。
正确的实现方式
内核提供了专门用于创建目录的函数,在你的5.11.0版本内核中,推荐使用kern_mkdir(更安全、更符合内核规范),或者sys_mkdir。下面是一个可运行的示例模块代码:
#include <linux/fs.h> #include <linux/module.h> #include <linux/syscalls.h> static int __init dir_create_init(void) { int ret; // 创建根路径下的/my_own_dir目录,权限设置为0755 ret = kern_mkdir("/my_own_dir", 0755); if (ret < 0) { printk(KERN_ERR "Failed to create directory! Error code: %d\n", ret); return ret; } printk(KERN_INFO "Directory /my_own_dir created successfully\n"); return 0; } static void __exit dir_create_exit(void) { // 模块退出时清理目录(注意目录需为空才能删除) int ret = sys_rmdir("/my_own_dir"); if (ret < 0) { printk(KERN_ERR "Failed to remove directory! Error code: %d\n", ret); } else { printk(KERN_INFO "Directory /my_own_dir removed successfully\n"); } } module_init(dir_create_init); module_exit(dir_create_exit); MODULE_LICENSE("GPL");
额外注意事项
- 内核函数兼容性:不同内核版本的文件系统操作函数可能有细微差异,
kern_mkdir在5.11版本是稳定可用的,若使用更旧版本可能需要调整为sys_mkdir(参数为路径字符串和权限)。 - 错误处理:内核态代码必须严格处理返回值,避免因未捕获的错误导致内核panic或系统异常。
- 清理工作:模块退出时务必删除创建的目录,避免在文件系统中留下无用的残留文件/目录。
内容的提问来源于stack exchange,提问作者Zong Jun
相关产品推荐
相关产品推荐

