Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Linux内核模块中读/写字符设备_Linux_Kernel_Character_Device - Fatal编程技术网

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

如何在Linux内核模块中读/写字符设备,linux,kernel,character,device,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

我自己用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()
,对吗?

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

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


您的内部代码只需调用该helper函数来直接附加缓冲区。如果您的驱动程序支持多个设备,则在执行内部写入时,您需要知道并指定要写入的设备实例。

尤其是,
dev\u write
必须使用
copy\u from\u user
函数类从用户空间安全复制数据,这将阻止它从内核空间缓冲区复制数据。原则上,您可以设置一个要使用的假用户空间上下文,但只为自己创建一个后门更容易。@bdonlan我是linux内核编程新手,请您详细说明如何设置要使用的假用户空间上下文或创建后门