2013-05-08 101 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手柄檢索數據。