我希望使用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
此代码导致从ADDRESS[0:4]
读取单个32位,然后将正确的值写入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
代码非常相似。
使用ctypes
可以进行低级指针取消引用并将值存储在指向的地址上而不会触发读取吗?