使用proc我们可以轻松使用read&写本系统调用,如本例所示。 write on /proc entry through user space
但我正在使用debugfs将信息从驱动程序传递到用户空间。 我能够找到这两个示例代码。这里的应用程序能够使用mmap()系统调用读取和写入debugfs文件。
但是在我的情况下假设需要使用带有设备驱动程序的Debugfs文件进行通信:
user-space application <-------> debugfs file <-------> Device driver
我可以在我的---&gt;&gt;中使用相同的代码mmap_simple_kernel.c设备驱动程序代码---&gt;&gt;并直接从驱动程序传输数据到debugfs?但是在这种情况下,我的驱动程序中会有两个file_operations结构会导致一些问题吗?这是正确的做法吗?
或者就像应用程序跟随-mmap_user.c中的进程一样---同样的过程 - 我跟随我的设备驱动程序。并将mmap_simple_kernel.c保留为debugfs entry的seprate模块?
答案 0 :(得分:2)
你可以看看kmemleak如何在mm / kmemleak.c中使用debugfs:
static const struct seq_operations kmemleak_seq_ops = {
.start = kmemleak_seq_start,
.next = kmemleak_seq_next,
.stop = kmemleak_seq_stop,
.show = kmemleak_seq_show,
};
static int kmemleak_open(struct inode *inode, struct file *file)
{
return seq_open(file, &kmemleak_seq_ops);
}
static int kmemleak_release(struct inode *inode, struct file *file)
{
return seq_release(inode, file);
}
static ssize_t kmemleak_write(struct file *file, const char __user *user_buf,
size_t size, loff_t *ppos)
{...}
static const struct file_operations kmemleak_fops = {
.owner = THIS_MODULE,
.open = kmemleak_open,
.read = seq_read,
.write = kmemleak_write,
.llseek = seq_lseek,
.release = kmemleak_release,
};
dentry = debugfs_create_file("kmemleak", S_IRUGO, NULL, NULL,
&kmemleak_fops);
答案 1 :(得分:2)
此问题是Google针对mmap debugfs的最佳搜索结果。我在这里添加一个重要信息。根据此https://lkml.org/lkml/2016/5/21/73帖子,内核4.8.0或更高版本中的debugfs_create_file()将忽略struct file_operations中的.mmap字段
使用debugfs_create_file_unsafe()作为解决方法