gpt4 book ai didi

python - 在单个操作中写入内存

转载 作者:行者123 更新时间:2023-12-01 08:41:05 24 4
gpt4 key购买 nike

我正在编写一个用户空间驱动程序,用于在 Python 3.5 中访问 FPGA 寄存器,mmap s FPGA的PCI地址空间,得到memoryview提供对内存映射寄存器空间的直接访问,然后使用struct.pack_into("<I", ...)将 32 位值写入选定的 32 位对齐地址。

def write_u32(address, data):
assert address % 4 == 0, "Address must be 32-bit aligned"
path = path.lib.Path("/dev/uio0")
file_size = path.stat().st_size
with path.open(mode='w+b') as f:
mv = memoryview(mmap.mmap(f.fileno(), file_size))
struct.pack_into("<I", mv, address, data)

不幸的是,它 appearsstruct.pack_intomemset(buf, 0, ...)在写入实际值之前清除寄存器。通过检查FPGA内的写入操作,我可以看到寄存器在设置真实值之前被设置为0x00000000,因此PCI总线上至少有两次写入(实际上对于32位访问有三个,两个零写入,然后是实际数据。64 位涉及 6 次写入)。这会对某些计算写入操作次数的寄存器或某些“写入时清除”或在写入时触发某些事件的寄存器产生副作用。

我想使用另一种方法在一次写入中将寄存器数据写入内存映射寄存器空间。我调查过 ctypes.memmove它看起来很有希望(尚未起作用),但我想知道是否还有其他方法可以做到这一点。

请注意,寄存器读取使用 struct.unpack_from工作完美。

请注意,我还通过使用记录所有访问的 QEMU 驱动程序消除了 FPGA - 在写入数据之前我看到了相同的双零写入访问。

我在 2022 年重新审视了这一点,情况并没有真正改变。如果您正在考虑使用memoryview要一次写入数据 block ,您可能会找到 this有趣。

最佳答案

也许这可以根据需要工作?

mv[address:address+4] = struct.pack("<I", data)

更新:

从注释中可以看出,上面的代码并没有解决问题。然而,它的以下变体确实如此:

mv_as_int = mv.cast('I')
mv_as_int[address/4] = data

不幸的是,精确理解幕后发生的事情以及为什么 Memoryview 会以这种方式表现超出了现代技术的能力,因此将为 future 的研究人员解决问题保持开放。

关于python - 在单个操作中写入内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53492716/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com