我无法弄清楚如何在Python中获取标准 mmap 对象的虚拟地址(来自mmap模块)。 记录的方法似乎只是以字节数组或字符串形式访问内存。
但我需要一次准确地访问mmap'ped内存2或4个字节 - 因为我的应用程序中的这个内存映射到硬件寄存器(想想/ dev / mem或GPIO等)。使用 ctypes 模块可以通过这种方式访问内存 - 但为此我需要映射的指针 - 或虚拟地址。
目前我通过使用libc中的原生open()和mmap()函数来克服这个问题(感谢相同的ctypes),但不愿意。
为什么mmap模块无法提供获取内存地址的简便方法?希望我错过了一些明显的东西......
- dd
答案 0 :(得分:4)
mmap
个对象支持可写缓冲区接口,因此您可以使用from_buffer
类与ctypes
对象作为参数的mmap
类方法来获取{ {1}}共享ctypes
文件内存的对象。
mmap
答案 1 :(得分:1)
这是一个更完整的代码,我需要在Linux上使用Python 2.7:
h4
{
text-align: left;
width: 90%;
font-size: 180%;
font-style: normal;
font-family: "Times New Roman", Times, serif;
padding: 10px 40px;
background: -webkit-radial-gradient(rgba(230,230,230,0.0), rgba(240,240,255,0.0), rgba(230,230,230,0.0));
}
同样,我应该遗漏一些明显的东西,因为我是Python的新手
- dd
回溯:
import os, io
from mmap import *
from ctypes import *
winsize= 0
devmemfd= -1
curr_va=0
curr_base=0
devf = None
mm = None
ptr4 = None
def mm_init( path = 'test.dat' ) :
global curr_va,winsize,devmemfd,mm,devf,ptr4
devf = open( path, "rwb")
devmemfd = devf.fileno()
mm = mmap(devmemfd, PAGESIZE, MAP_SHARED, PROT_WRITE) # this FAILS if MAP_SHARED
ptr4 = POINTER(c_uint32)( c_uint32.from_buffer(mm) ) # this FAILS is I make mapping readonly
curr_va = cast(ptr4, c_void_p).value
winsize=PAGESIZE
print("OK")