如何在Python中获取mmap-ed内存的地址?

时间:2015-09-02 23:44:02

标签: python cpython hardware-interface

我无法弄清楚如何在Python中获取标准 mmap 对象的虚拟地址(来自mmap模块)。 记录的方法似乎只是以字节数组或字符串形式访问内存。

但我需要一次准确地访问mmap'ped内存2或4个字节 - 因为我的应用程序中的这个内存映射到硬件寄存器(想想/ dev / mem或GPIO等)。使用 ctypes 模块可以通过这种方式访问​​内存 - 但为此我需要映射的指针 - 或虚拟地址。

目前我通过使用libc中的原生open()和mmap()函数来克服这个问题(感谢相同的ctypes),但不愿意。

为什么mmap模块无法提供获取内存地址的简便方法?希望我错过了一些明显的东西......

- dd

2 个答案:

答案 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")