1

この例に示すように、proc を使用すると、read & write システム コールを簡単に使用できます。 ユーザー空間を介して /proc エントリに書き込む

しかし、私は debugfs を使用してドライバーからユーザー空間に情報を渡すことに取り組んでいます。これら 2 つのサンプル コードを見つけることができます。ここで、アプリケーションは mmap() システム コールを使用して debugfs ファイルを読み書きできます。

しかし、私の場合、Debugfs ファイルを使用してデバイス ドライバーと通信するための要件を考えてみます。

user-space application    <-------> debugfs file <-------> Device driver
  1. --->> デバイス ドライバ コード --->> 内で同じコード mmap_simple_kernel.c を使用して、ドライバから直接 debugfs にデータを転送できますか? しかし、この場合、ドライバ内に 2 つの file_operations 構造が存在することになり、問題が発生するのでしょうか? それは正しいアプローチですか?

  2. または、アプリケーションが --- mmap_user.c --- 同じプロセスのプロセスに従っているのと同じように、デバイス ドライバー プログラムをフォローしています。そして、mmap_simple_kernel.c を debugfs エントリ用の別のモジュールとして保持しますか?

4

2 に答える 2

2

mm/kmemleak.c で kmemleak が 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);
于 2012-12-30T09:08:34.507 に答える