Я реализую драйвер устройства в пользовательском пространстве в python с помощью ctypes
и CUSE
часть FUSE
. Это не мой первый драйвер CUSE
, и в прошлом я смог сделать следующее, чтобы вернуть структуру.CUSE IOCTL Ответ с конструкцией, содержащей указатель на массив символов
class tvStruct(Structure):
_fields_ = [("tv_sec",c_long),
("tv_usec",c_long)]
Структуру timeval можно передать обратно в приложение, использующее вызов IOCTL с соответствующим номером. Ниже приведена операция файла IOCTL для драйвера CUSE
.
def ioctl(self, req, cmd, arg_p, file_info, uflags, in_buff_p, in_bufsz, out_bufsz):
ioctl = DECODE_IOC(cmd)
if ioctl == IOC_READ_TIMEVAL:
if not in_buff_p:
PyCuse.fuse_reply_ioctl_retry(req,
pointer(PyCuse.iovec(cast(arg_p,c_void_p),
sizeof(tvStruct))),1,
pointer(PyCuse.iovec(cast(arg_p,c_void_p),
sizeof(tvStruct))),1)
else:
tvPtr = cast(in_buff_p,POINTER(tvStruct))
PyCuse.fuse_reply_ioctl(req, 0, tvPtr, sizeof(tvStruct))
else:
print("%s Unrecognized IOCTL #...\n",self.devname)
PyCuse.fuse_reply_err(req,1)
Текущий драйвер, который я разрабатываю, должен возвращать структуру, содержащую указатель на массив символов.
# C++ Struct
typedef struct {
__u16 addr;
__u16 length;
__u8* pBuf;
} EEPromData;
# Python Class
class EEPromDataStruct(Structure):
_fields_ = [("addr",c_ushort),
("length",c_ushort),
("pBuf",POINTER(c_char))] # I have tried several other ctypes types
# for `pBuf`, but to no avail yet
Я понимаю, что я не могу присвоить указатель из Python в pBuf
, потому что это не тот же контекст памяти. Я также понимаю, что это довольно просто из пространства ядра с использованием copy_to_user
. Я связан требованиями, что это приложение python, потому что оно привязано к графическому интерфейсу python. Я ценю любую помощь.
Update 1
Я знаю, что это может быть решена с помощью метода fuse_reply_ioctl_retry
. Этот метод позволяет мне копировать данные из приложения и в приложение. Проблема в том, что при втором вызове fuse_reply_ioctl_retry
, FUSE
возвращает код ошибки в приложение. Я буду продолжать пытаться исправить это, но буду благодарен за любую помощь. Благодарю.