我正在使用ioctl调用进行内核模块编程,以在用户空间和内核空间之间进行通信。 我计划在python中创建用户空间api。
要在内核和用户空间之间传递数据,ioctl调用使用地址,并使用copy_to_user或copy_from_user复制数据。此处的地址由unsigned long arg
提供。
int ioctl(struct inode *inode,struct file *filp,unsigned int cmd,unsigned long arg)
在C用户空间编程中,传递地址是微不足道的。 我想要做的是使用python的struct来创建一个与我在内核模块中定义的结构兼容的结构,并使用来自fcntl的ioctl传递填充的python结构。 python的模块。
有可能吗? 如果可能,我如何在ioctl调用中传递python结构的地址?
我不想使用ctypes,或者用c扩展python。纯python代码,是我想要的。
答案 0 :(得分:0)
也许ctypes-module会在这里帮助你,特别是this section
答案 1 :(得分:0)
fcntl docs向您展示了如何执行此操作的示例。他们使用struct
和array
,但您也可以使用普通字符串。如果传递可变缓冲区且mutate_flag
为True,则实际的后备缓冲区将传递给OS调用。如果它是不可变的,则将传递一个副本,并且调用将返回缓冲区中的结果更改。请参阅fcntl.ioctl()的文档。
所以你不必关心支持struct的缓冲区的地址。只需将其作为struct
或string
传递。