我一直在研究一个PHP项目,它需要mmap'ing /dev/mem
才能访问硬件外设寄存器。由于没有本机mmap,我想到的最简单的方法是构建一个python子进程,它通过stdin/stdout
与PHP应用程序通信。
我遇到了一个奇怪的问题,这个问题只发生在阅读地址时,而不是写入地址。子进程正常运行(用于读取),具有以下内容:
mem.write(sys.stdin.read(length))
所以,我希望我可以反过来使用以下内容将内存段写回父级:
sys.stdout.write(mem.read(length))
如果我mmap一个标准文件,两个命令都按预期工作(与读/写的长度无关)。如果我映射/dev/mem
“文件,”在阅读过程中我会收到废话。值得注意的是,我映射的区域位于物理内存地址空间之外,用于访问外设寄存器。
我的解决方法如下:
for x in range(0, length / 4):
sys.stdout.write(str(struct.pack('L', struct.unpack_from('L', mem, mem.tell())[0])))
mem.seek(4, os.SEEK_CUR)
这使得读取的行为符合预期。
我无法理解的是,为什么使用unpack_from
从地址读取应该会看到与直接阅读它有所不同的原因。如果我尝试将读取分配给变量,则会发生相同的(非工作)事情。
如果其他上下文有用,我在Raspberry Pi / Debian 8上运行它。包含上述问题的文件是here。使用它的项目是here。