Как получить адрес mmap-ed памяти в Python?
Я не могу понять, как получить виртуальный адрес стандартныхmmap объектов в Python (из модуля mmap). Документированные методы, по-видимому, обращаются к памяти только в виде массива байтов или символьных строк.
Но мне нужно получить доступ к памяти mmap'ped точно на 2 или 4 байта сразу-потому что эта память в моем приложении сопоставлена с аппаратными регистрами (think /dev/mem или GPIO или такие). Доступ к памяти таким образом возможен с помощью модуляctypes - но для для этого мне нужен указатель - или виртуальный адрес - отображения.
В настоящее время я преодолеваю это с помощью собственных функций open() и mmap() из libc (благодаря тем же ctypes), но предпочел бы этого не делать.
Почему модуль mmap не предоставляет простого способа получить адрес памяти? Надеюсь, я упускаю что-то очевидное...
-- dd
2 ответа:
mmap
объекты поддерживают интерфейс буфера с возможностью записи, поэтому вы можете использовать метод классаfrom_buffer
, который классыctypes
имеют с объектомmmap
в качестве аргумента, чтобы получить объектctypes
, который разделяет память файлаmmap
.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