Я хочу вызвать функцию драйвера ядра с функцией 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
Большое спасибо, Мартина