linux 如何在内核模块中使用debugfs创建一个包含内容的文件?

bweufnob  于 2023-01-12  发布在  Linux
关注(0)|答案(1)|浏览(128)

使用这个API我可以在/sys/kernel/debug/parent/name中创建一个文件,但是无论我在void *data参数中放入哪些数据,它都是空的
struct dentry *debugfs_create_file(const char *name, mode_t mode, struct dentry *parent, void *data, struct file_operations *fops);
根据documentation,我们需要自己实现file_operations来处理文件的打开和写入。

static ssize_t myreader(struct file *fp, char __user *user_buffer, 
                                size_t count, loff_t *position) 
{ 
     return simple_read_from_buffer(user_buffer, count, position, ker_buf, len);
} 
 
static ssize_t mywriter(struct file *fp, const char __user *user_buffer, 
                                size_t count, loff_t *position) 
{ 
        if(count > len ) 
                return -EINVAL; 
  
        return simple_write_to_buffer(ker_buf, len, 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); 
      
    fileret = debugfs_create_file("text", 0644, dirret, "HELLO WORLD", &fops_debug);
    debugfs_create_u64("number", 0644, dirret, &intvalue); 
 
    return (0); 
}

将此模块安装到内核后,将在文件夹“dell”中创建两个文件“text”和“number”。文件“number”包含我作为“intvalue”传入的数字,但另一个文件“text”为空。文档中写入了 * 数据将存储在生成的inode结构的i_private字段中 * 我的期望:模块加载后,字符串“HELLO WORLD”将写入文件。
我认为问题应该出在读写操作函数上,是否可以用debugfs_create_file方法创建一个特定内容的文件?

4nkexdtk

4nkexdtk1#

要回答您的问题,无论您期望从代码中得到什么都是正确的,但它不会产生预期的结果。
我相信还有其他更有效、更正确的方法来做到这一点,但要解释目前的行为:

  • 您正在将数据初始化为文件text的内容,但您正在从user_buffer中的缓冲区ker_buf读取数据,而不是使用simple_read_from_buffer(user_buffer, count, position, ker_buf, len);读取文件指针
  • 类似地,您使用simple_write_to_buffer(ker_buf, len, position, user_buffer, count);user_buffer写入kern_buf

使用现有代码,如果您想实现您要尝试做的事情,那么您必须将字符串"HELLO WORLD"复制到init_debug()中的kern_buf
比如:strscpy(kern_buf, "HELLO WORLD", strlen("HELLO WORLD")+1);

static int __init init_debug(void) 
{ 
    dirret = debugfs_create_dir("dell", NULL); 
      
    fileret = debugfs_create_file("text", 0644, dirret, NULL, &fops_debug);
    debugfs_create_u64("number", 0644, dirret, &intvalue); 
    
    strscpy(kern_buf, "HELLO WORLD", strlen("HELLO WORLD")+1);
    return (0); 
}

编辑:
参考了一些在线资料,发现在初始化期间提供给debugfs_create_file()void *data存储在i_private字段中,以后可以从生成的inode structurei_private字段中检索。
可以从struct file *fpread()write()操作的第一个参数)提取相应文件的inode。
struct inodestruct file的成员,而i_privatestruct inode的成员
要通过read()中的debugfs_create_file()获取文件创建过程中提供的void *data,可以执行类似于以下所示的操作:

static ssize_t myreader(struct file *fp, char __user *user_buffer, 
                                size_t count, loff_t *position) 
{
    struct inode *l_inode = fp->f_inode;
    strscpy(user_buffer, (char *)l_inode->i_private, PAGE_SIZE);
    ...
    
}

相关问题