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

如何在内核模块中使用debugfs创建带指定内容的文件?

解决debugfs创建文件后内容为空的问题

能通过debugfs_create_file创建带初始内容的文件,但你的代码未正确利用传入的data参数,导致文件读取为空。

问题根源

  1. 你调用debugfs_create_file时将"HELLO WORLD"传入data参数,该值确实会存在inode的i_private字段中,但你的读函数myreader完全未使用这个字段,反而依赖未初始化的ker_buf,自然读不到内容。
  2. 代码中未定义len变量,这也会导致读写逻辑异常。

修改方案

方案1:仅支持读取初始内容(只读)

直接在读函数中获取传入的data参数作为内容源:

static ssize_t myreader(struct file *fp, char __user *user_buffer, 
                        size_t count, loff_t *position) 
{ 
    const char *init_msg = fp->f_inode->i_private; // 取出传入的初始字符串
    size_t msg_len = strlen(init_msg);
    return simple_read_from_buffer(user_buffer, count, position, init_msg, msg_len);
} 

static const struct file_operations fops_debug = { 
    .read = myreader, 
    // 若不需要写操作,可去掉.write字段
}; 

static int __init init_debug(void) 
{ 
    dirret = debugfs_create_dir("dell", NULL); 
    fileret = debugfs_create_file("text", 0444, dirret, "HELLO WORLD", &fops_debug);
    debugfs_create_u64("number", 0644, dirret, &intvalue); 

    return 0; 
}

方案2:支持读写操作(带初始内容)

由于字符串字面量处于只读内存段,无法直接写入,需提前定义可写的内核缓冲区,并将初始内容复制进去:

#define BUF_SIZE 64
static char ker_buf[BUF_SIZE];

static ssize_t myreader(struct file *fp, char __user *user_buffer, 
                        size_t count, loff_t *position) 
{ 
    char *buf = fp->f_inode->i_private;
    return simple_read_from_buffer(user_buffer, count, position, buf, BUF_SIZE);
} 

static ssize_t mywriter(struct file *fp, const char __user *user_buffer, 
                        size_t count, loff_t *position) 
{ 
    char *buf = fp->f_inode->i_private;
    if (count > BUF_SIZE) 
        return -EINVAL; 

    return simple_write_to_buffer(buf, BUF_SIZE, position, user_buffer, count); 
} 

static const struct file_operations fops_debug = { 
    .read = myreader, 
    .write = mywriter, 
}; 

static int __init init_debug(void) 
{ 
    dirret = debugfs_create_dir("dell", NULL); 
    // 将初始内容复制到可写缓冲区
    strscpy(ker_buf, "HELLO WORLD", BUF_SIZE);
    // 传入缓冲区指针作为data参数
    fileret = debugfs_create_file("text", 0644, dirret, ker_buf, &fops_debug);
    debugfs_create_u64("number", 0644, dirret, &intvalue); 

    return 0; 
}

关键注意点

  • 若需写入功能,必须使用可写的内核缓冲区,不能直接操作字符串字面量。
  • simple_read_from_buffer和simple_write_to_buffer会自动处理文件偏移量position,符合常规文件读写逻辑。
  • 确保缓冲区大小定义合理,避免内存越界。

内容的提问来源于stack exchange,提问作者Đức Thắng Trịnh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 10:55:18