передать указатель на fcntl.ioctl в python - PullRequest
0 голосов
/ 27 марта 2020

Я хочу вызвать функцию драйвера ядра с функцией ioctl из пакета fcntl.

Я хочу прочитать из Ядра. Я упаковываю свои аргументы в структуру и преобразовываю эту структуру в байтовый массив. Кроме пяти целых чисел мне также нужно передать указатель, переменная, на которую указывает указатель, должна быть изменяемой и редактироваться ядром.

class SRamAccess:
    mChannel = None
    mOffset = None
    mLen = None
    mSegOffset = None
    mSegLen = None
    mPadding = None
    mData = None  #pointer

format = "<LLLLLLQ" #little endian, 5 u32, u32 padding und 1 u64
sizeof = struct.calcsize(format)

@staticmethod
def to_bytes(mChannel, mOffset, mLen, mSegOffset, mSegLen, mPadding, mData):
    return struct.pack(SRamAccess.format, mChannel, mOffset, mLen, mSegOffset, mSegLen, mPadding, mData)

def __init__(self, bytes, offset):
    (self.mChannel, self.mOffset, self.mLen, self.mSegOffset, self.mSegLen, self.mPadding, self.mData) = struct.unpack_from(self.format, bytes, offset)

Поэтому я выделяю свой буфер с помощью create_string_buffer ctypes и передаю с помощью addressof () целое число в структуру и bytearray.

    buffer = ctypes.create_string_buffer(len*4) 
    arg = bytearray(SRamAccess.to_bytes(channel, offset, len, segOffset, segLen, 0, ctypes.addressof(buffer)))
    ret = fcntl.ioctl(self.fd, BBM_IOCTL_READ_BLOCK_DIRECT, arg, True)

Это правильный путь? Поскольку нет ответа от драйвера ядра.

enter code here

Большое спасибо, Мартина

...