mmap и проблема расширения хеш-таблицы в glibc - PullRequest
1 голос
/ 24 октября 2011

В способе обнаружения повреждения кучи я пытаюсь реализовать хеш-таблицу, чтобы хранить некоторую информацию о недопустимой памяти. Это делается внутри самого glibc. Когда мы выполняем malloc (), мы помещаем информацию, такую ​​как адрес и размер, в хеш-таблицу, а когда освобождаем (), мы освобождаем соответствующую запись в хеш-таблице, опять же, в самой функции glibc free ().

Чтобы выделить память для хэш-таблицы, у меня есть mmap'd некоторая память (воздерживаться от использования malloc для этого, так как шансы повреждения, вызванного процессом, могут также повредить мою хэш-таблицу). Проблема в том, что нет ограничения на количество malloc, которые может запрашивать процесс, для этого требуется, чтобы моя хеш-таблица была расширяемой. Поскольку моя хеш-таблица работает с индексами массива, память, используемая для хеш-таблицы, должна быть смежной, чтобы с помощью индекса мы могли легко добраться до корзины или записи. Теперь, когда хэш-таблица использует всю память, мне нужно снова сделать 'mmap' таким образом, чтобы эта память начиналась там, где заканчивалась предыдущая. Страница man mmap говорит, что мы можем предоставить адрес mmap, который будет служить подсказкой ядру для сопоставления виртуальной памяти по этому адресу. Для хеш-таблицы это будет выглядеть как кусок памяти. Я хотел бы попросить у вас предложений о том, насколько надежен этот подход и каковы возможные подводные камни при его использовании.

Ответы [ 2 ]

3 голосов
/ 31 октября 2011

Если это Linux, вы можете использовать mremap.

Если вы пишете свою хеш-таблицу, основываясь на смещениях, а не на абсолютных указателях, вы можете передать флаг MREMAP_MAYMOVE и вам никогда не придется беспокоиться о сбоях выделения. (Ну, во всяком случае, пока вы не исчерпаете свою виртуальную память.)

1 голос
/ 31 октября 2011

насколько надежен этот подход

MAP_FIXED очень надежен: ЕСЛИ память, которую вы запрашиваете, доступна, ядро ​​предоставит ее вам.

каковы потенциальные ловушки

Очевидный: возможно, что-то еще проникло в область, в которую вы хотите проникнуть, и вы проиграли.

Если вы делаете это для 64-битного процесса, вы можете mmap например, 1 ТБ памяти в качестве исходного распределения хеш-таблицы. До тех пор, пока вы на самом деле не получаете к нему доступ, этот mmap фактически бесплатный (по стоимости), при условии, что вы делаете MA_ANON отображение.

Кстати, я надеюсь, что вы понимаете, что вы заново изобретаете велосипед, так как многие существующие решения (такие как tcmalloc и jemalloc) уже предоставляют средства отладки, которые, вероятно, будут лучше, чем вы сами придумываете.

...