【问题标题】:How to get address of a struct object in python?如何在python中获取结构对象的地址?
【发布时间】: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 调用中传递它。

标签: python kernel


【解决方案1】:

也许 ctypes-module 会帮助你,尤其是this section

【讨论】:

    【解决方案2】:

    fcntl docs 向您展示了如何执行此操作的示例。他们使用structarray,但您也可以使用纯字符串。如果您传递一个可变缓冲区并且mutate_flag 为True,则实际的后备缓冲区将传递给操作系统调用。如果它是不可变的,则将传递一个副本,并且调用将返回缓冲区中的结果更改。请参阅fcntl.ioctl() 的文档。

    所以你不必关心支持结构的缓冲区的地址。只需将其作为structstring 传递即可。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多