Единственное, что я знаю (так что, возможно, это не лучший выбор), это использовать mmap
для Linux. Были некоторые ситуации, когда мне приходилось выделять огромные куски памяти, выровненные по определенным значениям, поэтому я использовал его (потому что здесь вы можете указать адрес и длину куска памяти), но это требует реализации некоторого модуля управления памятью, так как теперь вы собирается управлять распределениями (и выпусками).
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
Подробнее см. здесь: http://man7.org/linux/man-pages/man2/mmap.2.html
Чтобы он не отображался ни в какой файл, просто установите flags
в MAP_ANONYMOUS
:
КАРТА_АНОНИМНАЯ
Отображение не поддерживается никаким файлом; его содержимое инициализируется нулем. Аргументы fd и offset игнорируются; однако в некоторых реализациях требуется, чтобы fd был равен -1, если указано MAP_ANONYMOUS (или MAP_ANON), и переносимые приложения должны это обеспечивать. Использование MAP_ANONYMOUS в сочетании с MAP_SHARED поддерживается в Linux только начиная с ядра 2.4.
Если addr
равно NULL, тогда система выберет для вас доступный адрес, но, поскольку вы хотите выделить его выше 2G, вам нужно будет управлять списком выделенных страниц, чтобы узнать, какие адреса используются выше 2G. Также обратите внимание, что если вы укажете, что addr=X
, а mmap
не смогут использовать этот адрес, это не приведет к сбою, он просто выберет другой адрес, который можно использовать без какой-либо индикации сбоя (за исключением того факта, что возвращаемый указатель не будет быть равным addr
). Однако вы можете использовать флаг MAP_FIXED
для принудительного применения указанного вами адреса, и если mmap
не сможет его использовать, произойдет сбой (возврат MAP_FAILED
).
КАРТА_ИСПРАВЛЕНА
Не воспринимайте адрес как подсказку: поместите сопоставление именно по этому адресу. адрес должен быть кратен размеру страницы. Если область памяти, указанная с помощью addr и len, перекрывает страницы любого существующего сопоставления(ий), то перекрывающаяся часть существующего сопоставления(й) будет отброшена. Если указанный адрес не может быть использован, mmap() завершится ошибкой. Поскольку требование фиксированного адреса для сопоставления менее переносимо, использование этого параметра не рекомендуется.
ИЗМЕНИТЬ
ВНИМАНИЕ, что использование MAP_FIXED
не рекомендуется, поскольку, как сказано в описании
Если область памяти, указанная с помощью addr и len, перекрывает страницы любых существующих сопоставлений, то перекрывающаяся часть существующих сопоставлений будет отброшена.
и вы даже не узнаете об этом. Безопаснее проверить, что addr
равно возвращенному адресу mmap
.
person
Alex Lop.
schedule
16.09.2015