2012-04-21 197 views
3

我写的字符设备驱动程序自己在LKM,其只需在读/写字符设备:如何在Linux内核模块

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) 

我发现一个类似link在这里SE,但这种方式也不会叫我dev_write()函数写,但一些深层次像vfs_write(),右?

回答

1

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

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

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

+1

特别是,'dev_write'必须使用'copy_from_user'类的函数来安全地从用户空间复制数据,这将阻止它从内核空间缓冲区复制数据。原则上,您可以设置一个虚拟用户空间上下文来处理,但为自己创建一个后门更容易。 – bdonlan 2012-04-22 02:56:21

+1

@bdonlan我是linux内核编程的新手,请给我一个关于如何设置一个虚拟用户空间上下文来处理或创建一个后门的详细指令 – keywind 2012-04-22 07:23:12