макет памяти процесса Windows

Итак, я играл с отладчиком Olly, обнюхивая все, что я еще могу узнать об окнах, и нажал кнопку M, и появилось окно карты памяти. Итак, я поискал в Google несколько статей на эту тему и обнаружил, что могу писать по адресам выше 64К, которые я пробовал и хорошо ... почему бы это не сработать. О тех нижних 2 ГБ пространства:

  • Почему есть эти пробелы? Например, есть 0x10000-0x1FFFF R / Wable пространство, затем 128K ничего, а затем просто читаемое пространство. Я имею в виду, что это уже правильно разбито на страницы, поэтому на самом деле не должно иметь значения, было ли что-то в прошлом, например, в физическом пространстве (не говоря уже о том, что 0x20000-0x40000 должен быть полностью разрешен для чтения / записи в любом случае), почему кто-то решил не использовать какое-то адресное пространство так беспорядочно? Скорее всего, я просто сбит с толку, потому что в этой карте памяти от olly debugger многие строки оставлены пустыми там, где в столбце написано «Содержит». Может быть, есть какая-то ссылка, которую я мог бы просто противопоставить этой карте памяти от olly и выяснить, какое пространство имеет какое назначение и, таким образом, выгружается или нет?

  • Предположим, я действительно ничего не напортачил с управлением памятью, можно ли писать программы для Windows, используя эту нижнюю память вместо использования кучи, или я могу столкнуться с некоторыми проблемами?

Спасибо, что прочитали этот вопрос.

ИЗМЕНИТЬ

А, здесь мы идем с тем, что находится по адресу 0x10000, и это также, вероятно, почему эта страница разрешена для записи.


person Pyjong    schedule 26.01.2012    source источник
comment
Ну .. вот что я пытаюсь сделать с этим :)   -  person Pyjong    schedule 26.01.2012
comment
по поводу вашего последнего вопроса ... Я сомневаюсь, что вы могли писать в защищенную память. Его расположение зависит от ОС. Так что прочитайте больше о создании ОС, а затем прочтите, как Windows отображает свою память (я предполагаю, что победа, поскольку вы упомянули Олли)   -  person Adrian    schedule 26.01.2012
comment
Загрузка адреса 0x10000 в указатель и последующая запись значений до 0x20000 не вызвали никаких ошибок.   -  person Pyjong    schedule 26.01.2012
comment
В любом случае я не могу найти то, как окна отображают свою память, и почему я спрашиваю здесь. Я имею в виду, что есть статьи о виртуальном адресном пространстве Windows, но то, что я обнаружил, всегда только о разделении на пользовательскую и системную части и о том, как каждый процесс имеет одинаковую структуру памяти.   -  person Pyjong    schedule 26.01.2012
comment
@adelphus это Windows 7   -  person Pyjong    schedule 26.01.2012


Ответы (2)


Кажется, у вас нет четкого вопроса, поэтому сложно дать ценный ответ. Однако вы, кажется, подразумеваете вопрос Как Windows отображает память пользовательского пространства?

Во-первых, небольшое пространство виртуальной памяти от нуля до 64 КБ или более остается неназначенным, чтобы перехватить разыменование указателя на основе NULL. Это распространенные ошибки программирования, о которых мы хотим узнать немедленно. Программа почти наверняка должна завершиться, если это произойдет. Если оставить это пространство неотмеченным, возникает эквивалент SEGFAULT в Windows. Очень полезный.

Обычно следующим выделяется код и место для констант. После запуска программы обычно нет необходимости изменять это пространство, поэтому оно установлено только для чтения, а его части помечаются как исполняемые, обычно это первая часть, которая может составлять 99% пространства. Если есть библиотеки общего кода, они отображаются после первичного кода (обычно), часто с небольшими пробелами, чтобы сегмент кода библиотеки был выровнен по страницам (возможно, 4K, возможно, 64K или больше) для эффективного использования регистра управления памятью. Редко возникает необходимость в экономии пространства виртуальной памяти.

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

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

А над стеком - системное пространство.

Если процесс запрашивает доступ к общей памяти (с другими процессами), размер отображаемого окна определяет, где на карте памяти он может поместиться. Отображение слишком близко к тому месту, где растет куча, является проблемой, и слишком близкое к потенциальному росту стека также является проблемой. К счастью, довольно простые алгоритмы размещения решают эту проблему для подавляющего большинства программ. Просто подумайте о различных потребностях, и вы, вероятно, сможете понять, почему операционная система делает то, что делает.

person wallyk    schedule 26.01.2012

Не вся память доступна для использования приложениями. Например, некоторым типам оборудования требуется память, поэтому система (BIOS или ОС) выделяет блок физической памяти и оставляет его для управления оборудованием. Эта память может быть недоступна для прямого чтения (или записи), поскольку выполнение таких операций может повлиять на оборудование. Само оборудование может иметь свои собственные ограничения на то, какие диапазоны памяти оно может использовать.

Если вы работаете в Windows, вы не можете писать в произвольные участки памяти - ОС не позволит вам (по крайней мере, в пользовательском режиме) и все равно будет выгружать память, поэтому адрес, на который, как вы думаете, вы смотрите ( виртуальный адрес) не будет соответствовать фактическому адресу физической памяти.

В общем, вы должны читать и писать только в память, которая была запрошена и выделена вам ОС.

person adelphus    schedule 26.01.2012
comment
Да, вероятно, это выгружаемая память, и поэтому я не понимаю, почему карта такая, а не непрерывный блок виртуальной памяти. - person Pyjong; 26.01.2012
comment
@stupid_idiot возможно фрагментация; может быть, MS решила сделать это так в своем алгоритме - person Adrian; 26.01.2012