Как найти дыры в адресном пространстве?

У меня есть набор файлов, длина которых кратна размеру страницы моей операционной системы (FreeBSD 10). я бы хотел mmap() эти файлы на последовательных страницах оперативной памяти, что дает мне возможность рассматривать коллекцию файлов как один большой массив данных.

Желательно, используя переносимые функции, как найти достаточно большую область не отображенного адресного пространства, чтобы быть уверенным, что серия mmap() звонки в этот регион будут успешными?

2 ответа

Решение

Следуй этим шагам:

  1. Сначала вычислите общий размер, необходимый, перечислив ваши файлы и суммируя их размеры.
  2. Сопоставить одну область анонимной памяти этого размера с mmap, Если это не удастся, вы проиграете.
  3. Сохраните указатель и unmap площадь (на самом деле, unmap может не потребоваться, если ваша система mmap с фиксированным адресом неявным образом отображает любой предыдущий перекрывающийся регион).
  4. Сопоставьте первый файл по этому адресу с соответствующим MAP_FIXED флаг.
  5. Увеличить адрес на размер файла.
  6. вернитесь к шагу 4, пока все файлы не будут отображены.

Это должно быть полностью переносимо на любую систему POSIX, но некоторые ОС могут иметь причуды, которые мешают этому методу. Попытайся.

Вы могли бы mmap большой регион, где размер является суммой размеров всех файлов, используя MAP_PRIVATE | MAP_ANONи защита PROT_NONE что предотвратит излишнюю фиксацию ОС платой памяти.

Это зарезервирует, но не зафиксирует память.

Вы можете открыть файл filename1 в [baseAddr, size1) и открыть filename2 в [baseAddr + size1, baseAddr + size1 + size2), и так далее.

Я считаю, что флаги для этого MAP_FIXED | MAP_PRIVATE,

Другие вопросы по тегам