Как найти дыры в адресном пространстве?
У меня есть набор файлов, длина которых кратна размеру страницы моей операционной системы (FreeBSD 10). я бы хотел mmap()
эти файлы на последовательных страницах оперативной памяти, что дает мне возможность рассматривать коллекцию файлов как один большой массив данных.
Желательно, используя переносимые функции, как найти достаточно большую область не отображенного адресного пространства, чтобы быть уверенным, что серия mmap()
звонки в этот регион будут успешными?
2 ответа
Следуй этим шагам:
- Сначала вычислите общий размер, необходимый, перечислив ваши файлы и суммируя их размеры.
- Сопоставить одну область анонимной памяти этого размера с
mmap
, Если это не удастся, вы проиграете. - Сохраните указатель и
unmap
площадь (на самом деле,unmap
может не потребоваться, если ваша системаmmap
с фиксированным адресом неявным образом отображает любой предыдущий перекрывающийся регион). - Сопоставьте первый файл по этому адресу с соответствующим
MAP_FIXED
флаг. - Увеличить адрес на размер файла.
- вернитесь к шагу 4, пока все файлы не будут отображены.
Это должно быть полностью переносимо на любую систему POSIX, но некоторые ОС могут иметь причуды, которые мешают этому методу. Попытайся.
Вы могли бы mmap
большой регион, где размер является суммой размеров всех файлов, используя MAP_PRIVATE | MAP_ANON
и защита PROT_NONE
что предотвратит излишнюю фиксацию ОС платой памяти.
Это зарезервирует, но не зафиксирует память.
Вы можете открыть файл filename1
в [baseAddr, size1)
и открыть filename2
в [baseAddr + size1, baseAddr + size1 + size2)
, и так далее.
Я считаю, что флаги для этого MAP_FIXED | MAP_PRIVATE
,