python mmap行为与/dev/mem不一致

python mmap行为与/dev/mem不一致,python,linux,mmap,Python,Linux,Mmap,我一直在用PHP进行一个项目,该项目需要mmap'ing/dev/mem来访问硬件外围寄存器。由于没有本地mmap,我能想到的实现这一点的最简单方法是构造一个python子进程,它通过stdin/stdout与PHP应用程序通信 我遇到了一个奇怪的问题,它只发生在读地址时,而不是写地址时。子流程正常运行(用于读取),具有以下功能: mem.write(sys.stdin.read(length)) sys.stdout.write(mem.read(length)) for x in ran

我一直在用PHP进行一个项目,该项目需要mmap'ing
/dev/mem
来访问硬件外围寄存器。由于没有本地mmap,我能想到的实现这一点的最简单方法是构造一个python子进程,它通过
stdin/stdout
与PHP应用程序通信

我遇到了一个奇怪的问题,它只发生在读地址时,而不是写地址时。子流程正常运行(用于读取),具有以下功能:

mem.write(sys.stdin.read(length))
sys.stdout.write(mem.read(length))
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)
因此,我希望我可以使用以下方法反过来将内存段写回父级:

mem.write(sys.stdin.read(length))
sys.stdout.write(mem.read(length))
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)
如果我映射一个标准文件,这两个命令都会按预期工作(与读/写的长度无关)。如果我映射了
/dev/mem
“文件”,那么在读取过程中我会得到一些废话。值得注意的是,我映射的区域位于物理内存地址空间之外,用于访问外围寄存器

我所做的工作如下:

mem.write(sys.stdin.read(length))
sys.stdout.write(mem.read(length))
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\u from
读取地址会看到与直接读取地址不同的内容。如果我尝试将读取赋值给变量,也会发生同样的(非工作)情况

如果额外的上下文有帮助,我将在Raspberry Pi/Debian 8上运行它。包含上述问题的文件是。使用它的项目是