使用这个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方法创建一个特定内容的文件?
1条答案
按热度按时间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);
编辑:
参考了一些在线资料,发现在初始化期间提供给
debugfs_create_file()
的void *data
存储在i_private
字段中,以后可以从生成的inode structure
的i_private
字段中检索。可以从
struct file *fp
(read()
或write()
操作的第一个参数)提取相应文件的inode。struct inode
是struct file
的成员,而i_private
是struct inode
的成员要通过
read()
中的debugfs_create_file()
获取文件创建过程中提供的void *data
,可以执行类似于以下所示的操作: