Ну, это может показаться распространенным или уже заданным вопросом, но после поиска различных книг, онлайн-уроков и даже здесь, в SU, я все еще озадачен тем, как эти четыре зверя работают вместе в системе с защищенным режимом x86.
Какую правильную терминологию можно использовать при обсуждении этих вещей?
Насколько я понимаю, все эти 4 понятия совершенно разные, но они связаны, когда мы говорим о защите памяти. Вот где это испортилось для меня!
Я начну с обмена в первую очередь.
Swaping:
Процесс должен находиться в физической памяти для выполнения. Процесс может быть временно перенесен из физической памяти в резервное хранилище, а затем возвращен в память для продолжения выполнения.
Это особенно относится к средам многозадачности, где несколько процессов должны выполняться одновременно, и, следовательно, реализован планировщик ЦП, который решает, какой процесс следует перенести в резервное хранилище.
Пейджинг: он же простой пейджинг:
Предположим, что у процесса есть все адреса, которые он использует / получает в диапазоне от 0 до 16 МБ, скажем. Мы можем назвать это логическим адресным пространством процесса, так как адреса генерируются процессом.
Обратите внимание, что этим определением логическое адресное пространство процесса может отличаться от пространства другого процесса, так как процесс может быть больше или меньше.
Теперь мы разделим это логическое адресное пространство процесса на блоки одинакового размера, называемые страницами. Также разделите физическую память на блоки фиксированного размера, называемые кадрами.
По определению логический адрес = страница №: смещение на этой странице
Когда процесс выбирается для выполнения планировщиком процессора, его страницы загружаются из резервного хранилища во все доступные кадры памяти.
Обратите внимание, что все страницы, принадлежащие этому процессу, загружаются в память перед передачей управления этому процессу из планировщика. Когда этот процесс должен быть перенесен в резервное хранилище, все его страницы сохраняются в резервном хранилище.
Резервное хранилище разделено на блоки фиксированного размера, которые имеют тот же размер, что и кадры физической памяти.
Это облегчает процесс обмена, так как мы меняем страницу, а не байты. Это уменьшает фрагментацию в резервном хранилище, поскольку нам не нужно находить место для некоторых байтов, вместо этого мы смотрим, доступно ли пространство для страницы или нет.
Техника подкачки также уменьшает фрагментацию физической памяти, поскольку мы сохраняем страницу в памяти.
В основной памяти должно быть место для всех страниц, принадлежащих процессу, чтобы загрузить этот процесс в память для выполнения. Если есть место только для нескольких страниц этого процесса, тогда какой-то другой процесс (т.е. все страницы, принадлежащие процессу) должен быть перенесен в резервное хранилище, и тогда только все страницы процесса, который должен быть выполнен, должны быть загружены в память.
Таким образом, техника подкачки дает лучшую производительность, чем простая замена.
Таким образом, подкачка позволяет нам запускать несколько процессов без покупки слишком большого количества памяти, вместо этого мы можем работать с небольшим объемом памяти (этот объем должен быть таким, чтобы все страницы самой большой программы / процесса, который должен быть запущен на ПК) может быть загружен в память - т.е. вы должны знать, сколько памяти требует ваша программа, прежде чем запускать ее.) плюс дополнительное хранилище резервных копий, обычно на диске, которое имеет гораздо меньшую стоимость для гораздо большей емкости, чем основная память.
Таким образом, подкачка + разбиение по страницам позволяют эффективно управлять памятью, чтобы в системе можно было запустить несколько процессов.
Спрос-пейджинг:
Но физическая память, установленная в системе, не обязательно должна соответствовать требованиям процесса. Также необходимо запустить несколько процессов.
Решение состоит в том, чтобы загрузить только некоторые страницы процесса в память, и когда процесс обращается к адресу на странице, которой нет в памяти, генерируется сбой страницы, и ОС загружает эту страницу по требованию, чтобы процесс мог продолжить выполнение , Это экономит время на загрузку всех страниц этого процесса перед передачей управления ему, как это было в случае пейджинга + подкачки.
Этот метод хранения только частей процесса в памяти и хранения в резервном хранилище, например на диске, называется подкачкой по требованию.
Таким образом, пейджинг по требованию = пейджинг + свопинг + сохраняют только некоторые страницы (не все) процесса в памяти.
Это все о пейджинге и обмене, которые я знаю. Пожалуйста, поправьте меня, я ошибаюсь в каком-то месте выше.
Теперь мои вопросы:
как именно термины виртуальной памяти и виртуального адресного пространства (или линейного адресного пространства) связаны с поиском страниц по требованию в контексте защищенного режима x86.
Является ли "виртуальная память процесса" правильным термином или виртуальная память определена для всех процессов, работающих в настоящее время в многозадачной системе?
Прав ли я в: виртуальной памяти, доступной для процесса == наибольший адрес в виртуальном адресном пространстве (он же линейное адресное пространство) процесса + 1?
Речь идет о сегментации: в защищенном режиме x86 нам говорят, что каждый процесс может иметь виртуальное адресное пространство 4 ГБ (VAS), это означает, что поскольку в архитектуре x86 присутствует сегментация, мы можем разделить этот VAS на два или более сегмента. , В плоской модели x86 мы создаем сегменты в VAS процесса, все они точно перекрываются, поэтому эффективно отключается сегментация - сегментов нет. Но затем, если, скажем, по виртуальному адресу в VAS какого-либо процесса присутствуют некоторые инструкции процессора, возможно, что мы перезаписываем эти инструкции при выделении памяти (в этом VAS) или при создании переменных или массивов. Как мы гарантируем, что этого не произойдет. Защитные биты в дескрипторе не различают ч / б области, так как в плоском режиме все сегменты перекрываются. Этот бит может только предотвратить чтение кода или выполнение данных, и это также только потому, что сегменты доступны через селекторы.
или это что-то вроде того, что каждый сегмент рассматривается как его собственный VAS. Но в этом случае общая виртуальная память (или общая VAS), доступная для процесса в плоском режиме, будет тогда: «количество сегментов, принадлежащих процессу, x виртуальная память для одного сегмента». Для защищенного режима x86 это будет означать 6 x 4 ГБ = 24 ГБ VAS! предполагая 6 сегментов, указанных CS, DS, ES, GS, FS, SS регистрами. Это правильно ?
Каким образом среда, поддерживающая простой пейджинг (не пейджинг по требованию), но не виртуальную память, обеспечит защиту ч / б различных сегментов в модели плоской памяти? У нас есть два случая - одна система задач и система многозадачности.
ОБНОВЛЕНИЕ: 2012-07-29
Так что, если я правильно понимаю:
Виртуальная память - это концепция, и она реализована на архитектуре x86 с использованием техники пейджинга по требованию + некоторые защитные биты (в частности, бит U и бит W).
Таким образом, VAS процесса делится на страницы, которые затем используются в поисковой подкачке страниц.
Механизм виртуальной памяти имеет два основных применения в многозадачной среде:
Размер программы может превышать объем физической памяти, доступной для нее. Операционная система хранит те части программы, которые в данный момент используются, в основной памяти, а остальная часть - на диске. Это реализуется путем пейджинга по требованию, где каждая страница имеет соответствующий «текущий бит» и «бит доступа» в своей записи таблицы страниц.
Обеспечить защиту памяти, предоставив каждому процессу свое собственное виртуальное адресное пространство, чтобы один процесс не мог получить доступ к VAS другого процесса. Это реализуется с помощью некоторых защитных битов, связанных с каждой страницей. В частности, «бит пользователя / супервизора - бит U», бит W чтения / записи »в записи таблицы страниц используются для защиты доступа к странице.
Виртуальная память полезна как в однозадачной системе, так и в многозадачной системе. Для однозадачных систем релевантно только использование # 1.
Защита доступа к странице имеет 2 аспекта: защита на уровне привилегий и защита от записи. Они реализуются битом U (для prviledge) и битом W (для записи) соответственно. Эти биты присутствуют в записи таблицы страниц для этой страницы.
Защита памяти имеет 2 аспекта: защита программ от доступа друг к другу и защита программ от перезаписи, если сегменты перекрываются в VAS этого процесса / программы.
Теперь первая проблема решается с помощью VAS или концепции виртуальной памяти, но как насчет второй ?
Схема защиты доступа к странице не мешает последней, насколько я знаю. Таким образом, техника виртуальной памяти не предотвращает перезапись самими программами, если сегменты перекрываются в VAS процесса.
Но мне кажется, что даже защита на уровне сегментов не может предотвратить последнюю (перезаписывающуюся) проблему защиты памяти.
Процессор x86 всегда оценивает защиту на уровне сегмента перед выполнением проверки защиты на уровне страницы - независимо от того, плоская она или многосегментная модель - поскольку в процессоре x86 невозможно отключить сегментацию.
Рассмотрим сценарий плоской модели:
Рассмотрим виртуальный адрес, указанный CS:off. Теперь DS:off будет также ссылаться на тот же виртуальный адрес, что и CS:off, если значение «off» в обоих случаях одинаково. Это верно и для СС: выключено также.
Это также означает, что страница, в которой находится этот виртуальный / линейный адрес, рассматривается блоком подкачки как просто страница, так как она не знает о сегментации.
Предположим, что все сегменты программы в плоском режиме принадлежат к одному и тому же уровню привилегий, скажем, ring0.
Что произойдет, если мы попытаемся записать или выполнить данные в CS:off = DS:off = SS:off.
Предположим, что этот адрес не относится к коду ОС, отображенному в VAS процесса. Пожалуйста, просто оставьте ОС для простоты, я говорю о защите на аппаратном уровне!
Сначала будет проходить защита на уровне сегментов, затем будут проходить проверки на уровне привилегий при доступе к этой странице (странице, содержащей CS: выкл. Или DS: выкл. Или SS: выкл.), Поскольку здесь все сегменты принадлежат к одной и той же привилегии , но как насчет W бит для этой страницы. Это должно быть установлено в 1, чтобы разрешить записи, в противном случае, скажем, сегмент данных не сможет делать записи на своей странице. Так что это означает, что эта страница также доступна для записи.
Это означает, что мы можем читать / записывать / выполнять данные по этому виртуальному (линейному) адресу: CS: off = DS: off = SS: off.?
Я не понимаю, как аппаратное обеспечение x86 может обеспечить защиту в этом случае в случае перекрытия сегментов.