3

LKM で自分でキャラクター デバイス ドライバーを作成します。

dev_open(struct inode *inode, struct file *filp);
dev_read (struct file *filp, char __user *buf, size_t count, loff_t *f_pos)
dev_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos)
dev_release(struct inode *inode, struct file *filp)

次に、カーネル モジュールで、キャラクター デバイスへの書き込みも行います。書き込みでは、実際に関数を呼び出す必要があります。

dev_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos)

ここSEで同様のリンクdev_write()を見つけましたが、この方法では関数を呼び出して書き込むのではなく、より深いものを呼び出しますvfs_write()よね?

4

1 に答える 1

1

dev_write()モジュール内から呼び出そうとしないでください。それが本当にやりたいことである場合は、モジュールがデバイスに書き込むための別の方法が必要です。filp内部書き込みを行っているときは、有効なメモリ バッファまたはユーザー メモリ バッファがありません。

たとえば、dev_write()filp​​ を使用して、ユーザーがどのデバイスに書き込んでいるかを調べ、ユーザー バッファーからデータをチェックしてコピーします。別のヘルパー関数を呼び出して、データを適切な内部バッファーに貼り付けることができます。

内部コードは、そのヘルパー関数を呼び出して、バッファーを直接追加するだけです。ドライバーが複数のデバイスをサポートしている場合は、内部書き込みを行うときに、書き込み先のデバイスのインスタンスを把握して指定する必要があります。

于 2012-04-22T02:52:09.690 に答える