Windows процесс макета памяти - PullRequest
5 голосов
/ 26 января 2012

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

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

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

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

EDIT

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

Ответы [ 2 ]

3 голосов
/ 26 января 2012

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

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

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

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

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

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

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

1 голос
/ 26 января 2012

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

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

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

...