4

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

Какую правильную терминологию можно использовать при обсуждении этих вещей?

Насколько я понимаю, все эти 4 понятия совершенно разные, но они связаны, когда мы говорим о защите памяти. Вот где это испортилось для меня!

Я начну с обмена в первую очередь.

Swaping:

Процесс должен находиться в физической памяти для выполнения. Процесс может быть временно перенесен из физической памяти в резервное хранилище, а затем возвращен в память для продолжения выполнения.

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

Пейджинг: он же простой пейджинг:

Предположим, что у процесса есть все адреса, которые он использует / получает в диапазоне от 0 до 16 МБ, скажем. Мы можем назвать это логическим адресным пространством процесса, так как адреса генерируются процессом.

Обратите внимание, что этим определением логическое адресное пространство процесса может отличаться от пространства другого процесса, так как процесс может быть больше или меньше.

Теперь мы разделим это логическое адресное пространство процесса на блоки одинакового размера, называемые страницами. Также разделите физическую память на блоки фиксированного размера, называемые кадрами.

По определению логический адрес = страница №: смещение на этой странице

Когда процесс выбирается для выполнения планировщиком процессора, его страницы загружаются из резервного хранилища во все доступные кадры памяти.

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

Резервное хранилище разделено на блоки фиксированного размера, которые имеют тот же размер, что и кадры физической памяти.

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

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

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

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

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

Таким образом, подкачка + разбиение по страницам позволяют эффективно управлять памятью, чтобы в системе можно было запустить несколько процессов.

Спрос-пейджинг:

Но физическая память, установленная в системе, не обязательно должна соответствовать требованиям процесса. Также необходимо запустить несколько процессов.

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

Этот метод хранения только частей процесса в памяти и хранения в резервном хранилище, например на диске, называется подкачкой по требованию.

Таким образом, пейджинг по требованию = пейджинг + свопинг + сохраняют только некоторые страницы (не все) процесса в памяти.


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

Теперь мои вопросы:

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

  2. Является ли "виртуальная память процесса" правильным термином или виртуальная память определена для всех процессов, работающих в настоящее время в многозадачной системе?

  3. Прав ли я в: виртуальной памяти, доступной для процесса == наибольший адрес в виртуальном адресном пространстве (он же линейное адресное пространство) процесса + 1?

  4. Речь идет о сегментации: в защищенном режиме x86 нам говорят, что каждый процесс может иметь виртуальное адресное пространство 4 ГБ (VAS), это означает, что поскольку в архитектуре x86 присутствует сегментация, мы можем разделить этот VAS на два или более сегмента. , В плоской модели x86 мы создаем сегменты в VAS процесса, все они точно перекрываются, поэтому эффективно отключается сегментация - сегментов нет. Но затем, если, скажем, по виртуальному адресу в VAS какого-либо процесса присутствуют некоторые инструкции процессора, возможно, что мы перезаписываем эти инструкции при выделении памяти (в этом VAS) или при создании переменных или массивов. Как мы гарантируем, что этого не произойдет. Защитные биты в дескрипторе не различают ч / б области, так как в плоском режиме все сегменты перекрываются. Этот бит может только предотвратить чтение кода или выполнение данных, и это также только потому, что сегменты доступны через селекторы.

  5. или это что-то вроде того, что каждый сегмент рассматривается как его собственный VAS. Но в этом случае общая виртуальная память (или общая VAS), доступная для процесса в плоском режиме, будет тогда: «количество сегментов, принадлежащих процессу, x виртуальная память для одного сегмента». Для защищенного режима x86 это будет означать 6 x 4 ГБ = 24 ГБ VAS! предполагая 6 сегментов, указанных CS, DS, ES, GS, FS, SS регистрами. Это правильно ?

  6. Каким образом среда, поддерживающая простой пейджинг (не пейджинг по требованию), но не виртуальную память, обеспечит защиту ч / б различных сегментов в модели плоской памяти? У нас есть два случая - одна система задач и система многозадачности.

ОБНОВЛЕНИЕ: 2012-07-29

Так что, если я правильно понимаю:

Виртуальная память - это концепция, и она реализована на архитектуре x86 с использованием техники пейджинга по требованию + некоторые защитные биты (в частности, бит U и бит W).

Таким образом, VAS процесса делится на страницы, которые затем используются в поисковой подкачке страниц.

Механизм виртуальной памяти имеет два основных применения в многозадачной среде:

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

  2. Обеспечить защиту памяти, предоставив каждому процессу свое собственное виртуальное адресное пространство, чтобы один процесс не мог получить доступ к 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 может обеспечить защиту в этом случае в случае перекрытия сегментов.

1 ответ1

3

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

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

Итак, как мы не дадим программам связываться с этими средствами управления памятью? То, что мы называем защитой. Мы можем держать процессы изолированными, чтобы они не мешали операционной системе и другим процессам. Путаница в том, почему все эти термины объединяются, связана с тем, что они действительно взаимосвязаны. Привилегии, которые имеют этот код, указаны в таблице страниц. Таблица страниц сообщает MMU, как устроено виртуальное пространство, а также сообщает MMU, является ли страница A) представленной B) для чтения / записи C) разрешено ли выполнять код и D) на каком уровне привилегий (звонить) код на указанная страница может быть выполнена.

Когда планировщик планирует процесс, таблица страниц не воссоздается, новой памяти не требуется, операционная система просто говорит MMU использовать другую таблицу страниц, которая является процессом O(1), или, другими словами, не зависит от размера процесса или объема используемой памяти. Целые процессы редко выгружаются в память и из нее сразу, обычно это только страницы за раз, поэтому термин "подкачка" часто разъясняется как "подкачка страниц".

Хорошо, на этом фоне я постараюсь ответить на каждый из ваших вопросов:

  1. Линейное адресное пространство просто означает, что вы можете получить доступ к вещам от 0 до 2 ^ 32. Нет необходимости в причудливой сегментации, как это было необходимо во времена 16-битных процессоров. Виртуальная память просто означает, что линейное адресное пространство процесса определяется не основной памятью, а операционной системой, это означает, что операционная система может произвольно размещать страницы в этом адресном пространстве, помещая себя на высокий уровень, а процесс на более низкий уровень, например. Кроме того, процессор может указать, какие части этого виртуального адресного пространства доступны по каким привилегиям. Операционная система (ядро) загружается в каждое виртуальное адресное пространство, чтобы процессы могли выполнять системные вызовы и чтобы было куда идти, когда они выгружаются. Однако они не могут читать или писать в эту область, потому что она помечена ОС как "только привилегированный код". Они могут получить к нему доступ только через механизмы системных вызовов в процессоре (т. Е. Программные прерывания). Пейджинг по требованию просто означает, что процесс ожидает, что определенные части этого виртуального адресного пространства будут иметь определенный контент (возможно, файл или даже его части), но на самом деле это не так, ОС пометила область "отсутствует" в таблице страниц. , Когда процесс, наконец, получает доступ к этой области, потому что она отсутствует, процессор выдает ошибку, которая перехватывается ОС. Тогда ОС достаточно умна, чтобы загрузить эту страницу и перезапустить процесс, на котором она остановилась. Результатом является то, что процесс даже не знает о сбое, и вещи загружаются только по мере необходимости, экономя память.

  2. Виртуальная память - это имя всего этого механизма определения таблиц страниц и их защиты, а также страниц, возможно, находящихся на другом носителе, например на диске, поэтому они являются страницами. Виртуальная память, вероятно, является основным термином для вашего заголовка, за исключением, возможно, сегментации. Когда я ссылаюсь на конкретный процесс, я бы лично использовал что-то вроде "виртуального адресного пространства процесса", поскольку это однозначно относится к макету виртуальной памяти конкретного процесса.

  3. Нет. Как я упоминал ранее, ОС может произвольно отображать реальную память в любое место в виртуальном адресном пространстве процесса. Это означает, что он может, например, иметь ситуацию, когда код процесса находится по адресу 0x0, но куча (растущая) начинается с 0xFFFFFFF, очищенного с другой стороны адресного пространства. На самом деле могут быть ограничения на то, где объекты отображаются, из-за того, что драйверам устройств требуются определенные адресные области для оборудования, но для понимания виртуальной памяти ограничений нет.

  4. Сегментация - это просто схема адресации. В 286 он также использовался в качестве механизма для реализации защиты, но он оказался слишком негибким, и поэтому в 32-разрядных процессорах защита всегда выполняется с помощью подкачки (хотя, как я понимаю, схемы защиты 286 сохраняются при подкачке выключен). Поскольку защита определяется механизмом разбиения по страницам, сегментация не создает большего или меньшего риска перезаписи данных, чем в режиме плоской памяти. В большинстве форматов исполняемых файлов сегмент кода четко отделен от сегмента данных. Поскольку мы можем ожидать, что код никогда не изменится, операционная система обычно помечает страницы сегмента кода как доступные только для чтения, таким образом, любая попытка записи в код вызывает ошибку, и программа завершается. Это никогда не произойдет, если все переменные и массивы будут выделены через стек или кучу в современной операционной системе. Однако, если программа начинает копаться вне этого, она потерпит крах, прежде чем сможет перезаписать какой-либо код. Более высокий риск (и тот, который используется, чтобы быть большой проблемой) заключается в перезаписи вашего стека при переполнении буфера. Некоторые могут воспользоваться этим, чтобы поместить код в стек, а затем заставить его выполняться неавторизованно. В качестве исправления в таблицу страниц был добавлен новый бит "No eXecute" (NX). Это предотвращает выполнение страницы.

  5. Это совсем не так. Сегменты просто действуют как указатели на область (сегмент) исходных 2 ^ 32 байтов адресного пространства. Первоначально идея заключалась в том, что он будет сохранять указатели наименьшими, поскольку вы можете иметь указатель сегмента и указатель внутри этого сегмента, который будет меньше, чем все адресное пространство. Например, в 286 (16-разрядном процессоре) имело смысл сохранять указатели на 16-разрядных, но это представляло проблему, потому что 286 мог адресовать 2 ^ 24 байта памяти. Решение? Используйте сегментацию. Сегмент может иметь размер 2 ^ 16 байт, и они могут указывать в любом месте адресного пространства. Тогда, когда код должен был работать, он использовал бы 16-битные указатели только для этого сегмента. Это было быстрее и эффективнее. Когда вышли 32-битные процессоры, этот механизм больше не был необходим, но так как ранее он использовался так много кода, а программисты привыкли к ним, они сохранили сегментацию. Более новые 64-битные процессоры вообще не используют сегментацию.

  6. Путаница здесь заключается в том, что виртуальная память является термином для многих из этих различных механизмов. Виртуальная память необходима для многозадачности для защиты одного процесса от адресного пространства других процессов. Пейджинг и, соответственно, вытесняющая многозадачность возможны только с функциями виртуальной памяти. Однако многие из этих функций могут быть эффективно отключены. Возможно, вы не хотите перевод адреса? Затем сопоставьте каждую страницу с самим собой. Возможно, вы не хотите защиту памяти, но хотите трансляцию адресов? Тогда дайте все привилегии каждой странице. В DOS и других однопроцессорных системах возникает путаница, когда говорится о "защищенном режиме". Обычно это относится к 32-разрядному режиму, а не к 16-разрядному реальному режиму, поэтому, несмотря на название, это не обязательно означает, что защита используется, только то, что в этом режиме она может быть включена. Вероятно, существует много систем с одним процессом, которые работают в этом "защищенном режиме", но не используют ни виртуальную память, ни защиту. Оригинальный Xbox является хорошим примером этого. Может быть небольшое увеличение производительности, когда все эти функции отключены. Тем не менее, в DOS все еще может быть выгодно использовать многие из этих функций. Наиболее заметным является подкачка страниц, поскольку в первые дни, когда DOS был повсеместным, ОЗУ было трудно найти, и поэтому любой механизм, который экономил на ОЗУ, приветствовался и хорошо использовался. Защита имела свои преимущества и в однопроцессных системах, так как она могла предотвратить неприятный сбой программы, улучшить отладку и предотвратить повреждение данных из-за плохого доступа к оборудованию.

Надеюсь, это ответит на ваш вопрос.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .