Я хочу использовать 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).value
code.
Возможно ли с помощью ctypes
выполнить разыменование указателя низкого уровня и сохранить значение по адресу, на который указывает указатель, без запуска чтения?