如何在内核模块中使用debugfs创建带指定内容的文件?
解决debugfs创建文件后内容为空的问题
能通过debugfs_create_file创建带初始内容的文件,但你的代码未正确利用传入的data参数,导致文件读取为空。
问题根源
- 你调用
debugfs_create_file时将"HELLO WORLD"传入data参数,该值确实会存在inode的i_private字段中,但你的读函数myreader完全未使用这个字段,反而依赖未初始化的ker_buf,自然读不到内容。 - 代码中未定义
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
相关产品推荐
相关产品推荐

