Информация о PTE (записи таблицы страниц) в Windows - PullRequest
2 голосов
/ 19 апреля 2010

Чтобы легче находить переполнения буфера, я изменяю наш пользовательский распределитель памяти, чтобы он выделял целую страницу размером 4 КБ вместо только необходимого количества байтов. Затем я изменяю защиту и размер страницы так, что если вызывающая сторона пишет до или после выделенного фрагмента памяти, приложение немедленно завершает работу.

Проблема в том, что, хотя у меня достаточно памяти, приложение никогда не запускается полностью, потому что ему не хватает памяти. Это имеет две причины:

  • , поскольку для каждого выделения требуется 4 КБ, мы, вероятно, очень скоро достигнем предела в 2 ГБ. Эту проблему можно решить, если я сделаю 64-битный исполняемый файл (пока не пробовал).
  • даже когда мне нужно всего несколько сотен мегабайт, в определенный момент происходит сбой выделения.

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

Мои вопросы (или подсказки):

  • Где я могу найти информацию о максимальном количестве PTE в процессе?
  • Это отличается (выше) для 64-битных систем / приложений или нет?
  • Можно ли настроить количество PTE в приложении или в Windows?

Спасибо

Patrick

PS. Примечание для тех, кто будет пытаться утверждать, что вы не должны писать свой собственный менеджер памяти:

  • Мое приложение довольно специфично, поэтому я действительно хочу полный контроль над управлением памятью (не могу дать больше подробностей)
  • На прошлой неделе у нас была перезапись памяти, которую мы не смогли найти, используя стандартный распределитель C ++ и функциональные возможности отладки во время выполнения C / C ++ (в нем говорилось «блокирование повреждено» через несколько минут после фактического повреждения »)
  • Мы также попробовали стандартные утилиты Windows (например, GFLAGS, ...), но они замедлили приложение в 100 раз и не смогли найти точную позицию перезаписи либо
  • Мы также опробовали функциональность «Проверка страницы» в Application Verifier, но затем приложение также не запускается (вероятно, также не хватает PTE)

Ответы [ 4 ]

3 голосов
/ 19 апреля 2010

Вот то, что я подумал, было отличной серией постов в блоге Марка Руссиновича на тему "Расширение Windows ..."

http://blogs.technet.com/markrussinovich/archive/2008/07/21/3092070.aspx

В нем есть несколько статей о виртуальной памяти, постраничной нестраничной памяти, физической памяти и др.

Он упоминает о небольших утилитах, которые он использует для измерения ресурсов системы.

Надеюсь, вы найдете там свои ответы.

1 голос
/ 19 апреля 2010

Подход с использованием дробовика состоит в том, чтобы распределить эти изолированные записи по 4 КБ в случайном порядке . Это означает, что вам нужно будет повторно запускать одни и те же тесты с одним и тем же вводом несколько раз. Иногда он поймает ошибку, если вам повезет.

Немного более разумный подход - использовать другой алгоритм, а не просто случайный - например, сделать его зависимым от стека вызовов, является ли выделение выделенным. Вы доверяете std::string пользователям, например, и подозреваете, что raw malloc использует?

1 голос
/ 19 апреля 2010

Взгляните на реализацию OpenBSD malloc . Многое из тех же (и более) идей, реализованных очень опытными людьми.

1 голос
/ 19 апреля 2010

Чтобы легче находить буфер переполнения я меняю наш обычай распределитель памяти, так что он выделяет полная страница 4KB вместо только требуемое количество байтов.

Это уже сделано. Проверка приложения с PageHeap .

Информацию о PTE и архитектуре памяти можно найти в Internals Windows, 5-е издание. и Руководства Intel .

Это отличается (выше) для 64-битных систем / приложений или нет?

Конечно. 64-битная Windows имеет гораздо большее адресное пространство, поэтому для ее отображения требуется больше PTE.

Где я могу найти информацию о максимальное количество PTE в процессе?

Это не так важно, как максимальный объем адресного пространства, доступного в процессе. (Количество PTE - это число, деленное на размер страницы.)

Это 2 ГБ в 32-битной Windows и намного больше в x64 Windows. (Фактическое число варьируется, но оно «достаточно большое»).

Проблема в том, что хотя мне достаточно память, приложение никогда не запускается полностью, потому что заканчивается память.

У вас а) утечка памяти? б) используя ужасно неэффективные алгоритмы?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...