Есть ли способ преобразовать неразделяемую память кучи в разделяемую память? Основная цель *nix

Мне было интересно, есть ли какой-либо разумно переносимый способ взять существующую неразделяемую память кучи и преобразовать ее в общую память. Вариант использования — это блок памяти, который слишком велик, чтобы я мог копировать его без необходимости (т. е. в новый сегмент разделяемой памяти), и который выделяется подпрограммами, находящимися вне моего контроля. Основной целью является *nix/POSIX, но мне также было бы интересно узнать, можно ли это сделать в Windows.


person michaeljt    schedule 10.08.2010    source источник


Ответы (2)


Многие * nixe имеют procfs Plan-9, который позволяет открывать чтение памяти процесса, проверяя /proc/{pid}/mem

Вы сообщаете другому процессу свой pid, размер и базовый адрес, и он может просто прочитать данные (или mmap регион в своем собственном адресном пространстве).

EDIT:: По-видимому, вы не можете открыть /proc/{pid}/mem без предварительного ptrace(), так что это в основном бесполезно.


В большинстве *nix'ов ptrace(2) позволяет подключиться к процессу и прочитать его память.


Метод ptrace не работает на OSX, там нужно больше магии:


В Windows вам нужна функция ReadProcessMemory .


Поиск в Google «Что такое ReadProcessMemory для $OSNAME», кажется, возвращает исчерпывающие наборы результатов.

person Nordic Mainframe    schedule 10.08.2010
comment
Я думал о более переносимом/менее агрессивном способе, чем procps или ptrace, которые являются более инструментами отладки, чем IPC (и, в частности, только один процесс может одновременно выполнять данную задачу). Я предполагаю, что мне не повезло с этим. - person michaeljt; 10.08.2010

Вы можете попробовать использовать mmap() с флагом MAP_FIXED и адресом вашей нераспределенной памяти (выделенной из кучи). Однако, если вы предоставите mmap() собственный указатель, то он будет ограничен выравниванием и размером в соответствии с размером страницы памяти (может быть запрошен sysconf()) поскольку сопоставление доступно только для всей страницы.

person pmod    schedule 10.08.2010
comment
Что касается MAP_FIXED, я думал, что это аннулирует все, что раньше было на карте, а не делит эту память. - person michaeljt; 10.08.2010