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

时间:2016-10-06 10:00:29

标签: 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))

如果我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

0 个答案:

没有答案
相关问题