从设备驱动程序向debugfs写入数据

时间:2012-12-29 08:07:24

标签: linux-kernel linux-device-driver

使用proc我们可以轻松使用read&写本系统调用,如本例所示。 write on /proc entry through user space

但我正在使用debugfs将信息从驱动程序传递到用户空间。 我能够找到这两个示例代码。这里的应用程序能够使用mmap()系统调用读取和写入debugfs文件。

但是在我的情况下假设需要使用带有设备驱动程序的Debugfs文件进行通信:

user-space application    <-------> debugfs file <-------> Device driver
  1. 我可以在我的---&gt;&gt;中使用相同的代码mmap_simple_kernel.c设备驱动程序代码---&gt;&gt;并直接从驱动程序传输数据到debugfs?但是在这种情况下,我的驱动程序中会有两个file_operations结构会导致一些问题吗?这是正确的做法吗?

  2. 或者就像应用程序跟随-mmap_user.c中的进程一样---同样的过程 - 我跟随我的设备驱动程序。并将mmap_simple_kernel.c保留为debugfs entry的seprate模块?

2 个答案:

答案 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()作为解决方法