【发布时间】:2013-01-05 16:11:54
【问题描述】:
我正在使用 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创建一个与我在内核模块中定义的结构兼容的结构,并使用来自python的fcntl模块的ioctl传递填充的python结构。
有可能吗? 如果可以的话,如何在ioctl调用中传递python struct的地址?
我不想使用 ctypes,或者用 c 扩展 python。纯python代码,是我想要的。
【问题讨论】:
-
(+1) 在同一个问题中使用
[python]和[kernel-programming]:) -
不知道为什么你“不想使用 ctypes”,因为这正是创建它的任务!
-
您阅读过
fcntl的基础知识吗?因为它已经完成了您的要求:“.. 当参数是字符串时,它表示二进制结构,例如由 struct.pack() 创建。二进制数据被复制到缓冲区,其地址被传递给 C fcntl () 称呼。 ..”。你还有什么想做的吗? -
@Francis Avila:我正在开发的模块的源代码非常大,我不是作者。所以我很难实现 ctypes,重新定义所有结构等。所以基本上,我只想动态创建结构,然后在 ioctl 调用中传递它。