2013-01-22 59 views
3

我正在做內核模塊編程,使用ioctl調用來在用戶空間和內核空間之間進行通信。 我打算在python中製作用戶空間api。如何獲取python中的結構對象的地址?

要在內核和用戶空間之間傳遞數據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結構的地址?

我不想使用ctypes或用c擴展python。純Python代碼,是我想要的。

+1

(+1)在同一個問題中使用'[python]'和'[kernel-programming]':) – NPE

+0

不確定你爲什麼「不想使用ctypes」,因爲這正是它的任務它被創造了! –

+1

你讀過'fcntl'的基礎知識嗎?因爲它已經做了你所要求的:「..當參數是一個字符串時,它表示一個二進制結構,例如由struct.pack()創建。二進制數據被複制到一個緩衝區,其地址被傳遞給C fcntl ()呼叫......「。你還想做什麼? – mmgp

回答

0

fcntl docs告訴你的例子如何做到這一點。他們使用structarray,但您也可以使用普通字符串。如果你通過一個可變緩衝區並且mutate_flag爲真,則實際的後備緩衝區將被傳遞給OS調用。如果它是不可變的,一個副本將被傳遞,緩衝區中產生的變化將由該調用返回。請參閱fcntl.ioctl()的文檔。

因此,您不必關心支持該結構的緩衝區的地址。只要通過它作爲structstring

0

也許ctypes的模塊將幫助你在這裏,特別是this section

相關問題