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 回答