Чтобы легче находить переполнения буфера, я изменяю наш пользовательский распределитель памяти, чтобы он выделял целую страницу размером 4 КБ вместо только необходимого количества байтов. Затем я изменяю защиту и размер страницы так, что если вызывающая сторона пишет до или после выделенного фрагмента памяти, приложение немедленно завершает работу.
Проблема в том, что, хотя у меня достаточно памяти, приложение никогда не запускается полностью, потому что ему не хватает памяти. Это имеет две причины:
- , поскольку для каждого выделения требуется 4 КБ, мы, вероятно, очень скоро достигнем предела в 2 ГБ. Эту проблему можно решить, если я сделаю 64-битный исполняемый файл (пока не пробовал).
- даже когда мне нужно всего несколько сотен мегабайт, в определенный момент происходит сбой выделения.
Вторая проблема является самой большой, и я думаю, что она связана с максимальным количеством PTE (записей таблицы страниц, которые хранят информацию о том, как виртуальная память отображается на физическую память, и о том, должны ли страницы быть доступны только для чтения или нет ) вы можете иметь в процессе.
Мои вопросы (или подсказки):
- Где я могу найти информацию о максимальном количестве PTE в процессе?
- Это отличается (выше) для 64-битных систем / приложений или нет?
- Можно ли настроить количество PTE в приложении или в Windows?
Спасибо
Patrick
PS. Примечание для тех, кто будет пытаться утверждать, что вы не должны писать свой собственный менеджер памяти:
- Мое приложение довольно специфично, поэтому я действительно хочу полный контроль над управлением памятью (не могу дать больше подробностей)
- На прошлой неделе у нас была перезапись памяти, которую мы не смогли найти, используя стандартный распределитель C ++ и функциональные возможности отладки во время выполнения C / C ++ (в нем говорилось «блокирование повреждено» через несколько минут после фактического повреждения »)
- Мы также попробовали стандартные утилиты Windows (например, GFLAGS, ...), но они замедлили приложение в 100 раз и не смогли найти точную позицию перезаписи либо
- Мы также опробовали функциональность «Проверка страницы» в Application Verifier, но затем приложение также не запускается (вероятно, также не хватает PTE)