Почему в виртуальном адресном пространстве процесса есть дыры - PullRequest
0 голосов
/ 12 декабря 2018

В моем учебнике сказано, что в виртуальном адресном пространстве процесса есть большие дыры, которые не сопоставлены с какими-либо значимыми данными.Но когда мы создаем исполняемый объектный файл, все определяется, например .text, .data, общие объекты и т. Д., Единственная динамическая вещь, которая может потребоваться с пропуском, - это стек. Так откуда же другие пропуски?почему мы не сжимаем все, просто оставляем только пробел для стека?enter image description here

enter image description here

Другой вопрос, на втором рисунке, в чем разница между нераспределенными страницами ВМ и нераспределенными страницами?

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Ваша диаграмма - грубое упрощение.Это не правильно:

Но когда мы создаем файл исполняемого объекта, все определяется, например .text, .data, общие объекты и т. Д.,

Такие вещи, как тексти данные являются коллекциями в исполняемом файле.Не существует в памяти.

В 64-разрядной системе доступно более миллиарда гигабайт адресуемого пространства.Ни одно из существующих приложений не может использовать столько памяти, поэтому в адресном пространстве будут дыры.

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

Существует целый ряд системных адресов.Они, как правило, зарезервированы, но есть много неиспользуемого пространства.Это создает дыры.

Если вы пытались сохранить непрерывный диапазон адресов, пригодный для использования, вы создаете проблему необходимости сохранять память непрерывной.Это создает всевозможные проблемы с распределением.

другой вопрос, на втором рисунке, в чем разница между нераспределенными страницами виртуальных машин и нераспределенными страницами?

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

0 голосов
/ 12 декабря 2018

На первом рисунке в виртуальном адресном пространстве есть три пробела.Дыра в 0 есть, потому что это полезно;В программных ошибках часто случайно используется маленькое целое число в качестве адреса, поэтому, если адрес не отображается в адресном пространстве, аппаратное обеспечение MMU может его обнаружить.

Дыра в конце состоит в том, что мы не использовали все адресное пространство!

Дыра перед общей библиотекой может быть по нескольким причинам.На многих архитектурах библиотеки имеют «предпочтительный» адрес для загрузки по адресу;размещение их в другом месте требует работы по переносу и, возможно, нескольких не используемых страниц.Расположение их «произвольно» делает некоторые хаки несколько сложнее, чем если бы во всех системах была библиотека X по предсказуемому адресу.И, наконец, вы забыли о куче - области динамически распределенной памяти, часто размещаемой после данных, выделенных объектным файлом.

На второй диаграмме «нераспределенные страницы ВМ», по-видимому, означают пространство, для которогов таблицах страниц ничего нет«Нераспределенные страницы» имеют записи в таблицах страниц, поэтому в некотором смысле они немного ближе к существующим.Я не уверен, что автор хочет сделать, хотя.Это не очень важно для самой исполняемой программы.

Относительно того, почему адресное пространство не сжимается: оно ничего не получает.Недостаточным ресурсом является реальная память, а не (обычно) сжатое адресное пространство.Положительным преимуществом является возможность сознательно иметь дыры, чтобы данные могли расширяться при необходимости.

...