如何在Linux内核模块中读/写字符设备
我自己用LKM编写了字符设备驱动程序,它有:如何在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
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内核编程新手,请您详细说明如何设置要使用的假用户空间上下文或创建后门