如何在Linux内核模块中读/写字符设备

时间:2012-04-21 15:08:35

标签: linux kernel character device

我自己在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)

然后在我的内核模块中,我也想写入字符设备,而write必须实际调用我的函数:

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

我在SE发现了一个类似的link,但是这样它就不会调用我的dev_write()函数来编写,但有些像vfs_write()更深,正确?

1 个答案:

答案 0 :(得分:1)

请勿尝试从模块中调用dev_write()。您需要一种单独的方式让您的模块写入设备,如果这真的是您想要做的。在进行内部写操作时,您没有有效的filp或用户内存缓冲区。

例如dev_write()将使用filp来确定用户正在写入的设备,并检查和复制用户缓冲区中的数据。它可以调用一个单独的辅助函数来将数据粘贴到适当的内部缓冲区中。

您的内部代码只会调用该帮助函数来直接追加缓冲区。如果您的驱动程序支持多个设备,那么当您执行内部写入时,您将需要知道并指定要写入的设备的哪个实例。