Моя основная проблема заключается в том, что мне нужно разрешить нескольким процессам ОС связи через большую кучу общей памяти, которая сопоставляется с одинаковыми диапазонами адресов во всех процессах. (Чтобы убедиться, что значения указателя действительно значимы.)Как обеспечить совместимость malloc и mmap, т. Е. Работать с неперекрывающимися областями памяти?
Теперь я столкнулся с проблемой, что часть программы/библиотеки использует стандартный malloc/free, и мне кажется, что базовая реализация не учитывает сопоставления, которые я создаю с mmap. Или еще один вариант заключается в том, что я создаю сопоставления в регионах, которые malloc уже планировал использовать.
К сожалению, я не могу гарантировать 100% идентичное поведение malloc/free во всех процессах, прежде чем устанавливать mmap-сопоставления.
Это заставляет меня указывать флаг MAP_FIXED в mmap. Первый процесс использует 0x0 в качестве базового адреса, чтобы гарантировать, что диапазон отображения по крайней мере как-то разумный, но, похоже, не передается другим процессам. (Двоичный файл также связан с -Wl, -no_pie.)
Я попытался выяснить, могу ли я запросить систему, какие страницы она планирует использовать для malloc, прочитав malloc_default_zone, но этот API не я предлагаю то, что мне нужно.
Есть ли способ гарантировать, что malloc не использует определенные страницы памяти/адреса?
(Он должен работать на советы OSX Linux, которые направляют меня в правильном направлении оценить, тоже.).
Самый надежный способ я нашел, к сожалению, не универсален: я был в состоянии перестроить мой Smalltalk VM немного и был в состоянии чтобы избавиться от типичного 'exec()' after' fork() '. Это, естественно, сохраняет mmappings. Однако он поставляется с кучей других компромиссов. – smarr