如何获取Python中mmap-ed内存的地址?
How to get the address of mmap-ed memory in Python?
我不知道如何在 Python 中获取标准 mmap 对象的虚拟地址(来自 mmap 模块)。
记录的方法似乎只能以字节数组或字符串的形式访问内存。
但我需要一次精确访问 2 或 4 个字节的 mmap 内存 - 因为我的应用程序中的内存映射到硬件寄存器(想想 /dev/mem 或 GPIO 等)。使用 ctypes 模块可以以这种方式访问内存 - 但为此我需要映射的 pointer - 或虚拟地址。
目前,我通过使用 libc 中的本机 open() 和 mmap() 函数(感谢相同的 ctypes)来克服这个问题,但我宁愿不这样做。
为什么 mmap 模块不提供简单的方法来获取内存地址?希望我遗漏了一些明显的东西...
-- dd
mmap
对象支持可写缓冲区接口,因此您可以使用 ctypes
classes 具有的 from_buffer
class 方法与 mmap
对象作为参数获取共享 mmap
文件内存的 ctypes
对象。
buf = mmap.mmap(fd, mmap.PAGESIZE, mmap.MAP_SHARED, mmap.PROT_WRITE)
int_pointer = ctypes.c_int.from_buffer(buf)
这是我需要使用的更完整的代码,使用 Python 2.7,在 Linux:
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")
同样,我应该遗漏了一些明显的东西,因为我是 Python
的新手
-- dd
回溯:
>>> mm_init()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "mm-test.py", line 17, in mm_init
mm = mmap(devmemfd, PAGESIZE, MAP_SHARED, PROT_WRITE)
mmap.error: [Errno 13] Permission denied
我不知道如何在 Python 中获取标准 mmap 对象的虚拟地址(来自 mmap 模块)。 记录的方法似乎只能以字节数组或字符串的形式访问内存。
但我需要一次精确访问 2 或 4 个字节的 mmap 内存 - 因为我的应用程序中的内存映射到硬件寄存器(想想 /dev/mem 或 GPIO 等)。使用 ctypes 模块可以以这种方式访问内存 - 但为此我需要映射的 pointer - 或虚拟地址。
目前,我通过使用 libc 中的本机 open() 和 mmap() 函数(感谢相同的 ctypes)来克服这个问题,但我宁愿不这样做。
为什么 mmap 模块不提供简单的方法来获取内存地址?希望我遗漏了一些明显的东西...
-- dd
mmap
对象支持可写缓冲区接口,因此您可以使用 ctypes
classes 具有的 from_buffer
class 方法与 mmap
对象作为参数获取共享 mmap
文件内存的 ctypes
对象。
buf = mmap.mmap(fd, mmap.PAGESIZE, mmap.MAP_SHARED, mmap.PROT_WRITE)
int_pointer = ctypes.c_int.from_buffer(buf)
这是我需要使用的更完整的代码,使用 Python 2.7,在 Linux:
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")
同样,我应该遗漏了一些明显的东西,因为我是 Python
的新手-- dd
回溯:
>>> mm_init()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "mm-test.py", line 17, in mm_init
mm = mmap(devmemfd, PAGESIZE, MAP_SHARED, PROT_WRITE)
mmap.error: [Errno 13] Permission denied