Python ctypes: разыменовать указатель для записи данных без чтения - PullRequest
0 голосов
/ 30 ноября 2018

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

Самое близкое, что мне удалось получить к этому требованию, - это одно чтение, за которым следует одна запись:

import ctypes
# mv is a "memoryview" (obtained via mmap actually) at a certain ADDRESS
i = ctypes.c_uint.from_buffer(mv[0:4])
i.value = 0x12345678

Этот код приводит к одиночному 32-битному чтению из ADDRESS[0:4] с последующей записью правильного значения в ADDRESS[0:4].Я бы хотел избежать начального чтения.

Я посмотрел на указатели ctypes и подумал, что что-то подобное может сработать:

address = ctypes.addressof(i)
read_val = ctypes.cast(address, ctypes.POINTER(ctypes.c_uint)).content  # performs a 32-bit READ
ctypes.cast(address, ctypes.POINTER(ctypes.c_uint)).content = ctypes.c_uint(0x1234)  # sadly doesn't perform a WRITE
ctypes.cast(address, ctypes.POINTER(ctypes.c_uint)).contents.value = 0x1234  # performs a 32-bit READ then a 32-bit WRITE

Так что это ведет себя почти так же, как .from_buffer(address).valuecode.

Возможно ли с помощью ctypes выполнить разыменование указателя низкого уровня и сохранить значение по адресу, на который указывает указатель, без запуска чтения?

...