2013-05-08 99 views
0

我正在研究beaglebone(运行Angstrom Linux)并尝试使用Python的mmap模块获取对/dev/mem文件的读写权限。为什么mmap返回零大小?

但是,由于某些原因,下面的代码打印出的值为零。我对mmap相当陌生,我不确定是否有什么明显的缺失。

from mmap import mmap 

mmap_offset=0x44c00000 
mmap_size=0x48ffffff-mmap_offset 

with open("/dev/mem", "r+b") as f: 
    testMap=mmap(f.fileno(),mmap_size,offset=mmap_offset) 

print testMap.size() 
print testMap[0] 

回报:

0 
8 
+2

[The docs](http://docs.python.org/2/library/mmap.html#mmap.size)say *“返回文件的长度,该长度可以大于内存的大小“*也许这是因为所有设备节点根据'stat()'有一个表观大小为0?如果你真的试图从mmap对象中获取数据会发生什么? – cdhowie 2013-05-08 16:18:39

+0

@cdhowie说什么。另外,我认为你的意思是“0x49000000”而不是“0x48ffffff”,因为使用“0x48ffffff”,你最终不会映射最后一页的最后一个字节。 – Celada 2013-05-08 16:27:05

+0

我已经更新了代码,我认为它可以解答你的问题......它看起来像是存储器映射中的值。我不熟悉'stat()' – Chris 2013-05-08 16:28:07

回答

1

由于设备的inode像/dev/mem报告时由stat()查询0-2的表观大小。这就是特殊设备节点的实现方式,因为询问设备节点有多大通常是没有用的。 (考虑/dev/zero/dev/kbd/dev/urandom,并且被用于通信,而不是数据存储,诸如表示相片扫描仪或输入设备的设备节点的任何设备节点。)

您应该仍然能够从MMAP手柄检索数据。