You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

内核模块中能否在根路径创建目录?我的实现为何导致终端冻结?

内核模块中创建根路径目录的问题解析

首先明确回答:完全可以在内核模块中于根路径创建目录,但你的实现方式存在关键错误,这正是导致模块插入时终端冻结的原因。

你的代码问题所在

你使用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");

额外注意事项

  1. 内核函数兼容性:不同内核版本的文件系统操作函数可能有细微差异,kern_mkdir在5.11版本是稳定可用的,若使用更旧版本可能需要调整为sys_mkdir(参数为路径字符串和权限)。
  2. 错误处理:内核态代码必须严格处理返回值,避免因未捕获的错误导致内核panic或系统异常。
  3. 清理工作:模块退出时务必删除创建的目录,避免在文件系统中留下无用的残留文件/目录。

内容的提问来源于stack exchange,提问作者Zong Jun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 17:22:49