Аппаратные средства процессора x86 для управления памятью

Автор работы: Пользователь скрыл имя, 26 Октября 2011 в 23:15, реферат

Краткое описание

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

Содержимое работы - 1 файл

Аппаратные Средства Процессора х86 Для Управления Памятью.doc

— 65.50 Кб (Скачать файл)
    1. Аппаратные  средства процессора x86 для управления памятью

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

      1. Реальный  и защищенный режимы работы процессора

   Оригинальный  процессор i8086 предназначался для работы в однопрограммном режиме и не имел никаких механизмов защиты памяти. Однако к тому времени, как разработчики осознали необходимость включения в микропроцессор средств поддержки мультипрограммных вычислений, было создано много различных программных продуктов. Для того, чтобы обеспечить совместимость этих программ с новым «железом», была реализована возможность работы процессоров в двух режимах: реальном (real mode) и защищенном (protected mode). Реальный режим работы совпадает с единственным режимом работы первых 16-битовых процессоров. В защищенном режиме включаются возможности по аппаратной защите параллельных вычислений, основанные на особенностях 32-разрядной архитектуры. Рассмотрим особенности работы двух режимов применительно к доступу к оперативной памяти.

   Напомним, что в реальном режиме память имеет  сегментную организацию, и физический (эффективный) адрес получается из сегментного адреса и смещения в этом сегменте по формуле

   segment * 16 + offset

   Для хранения адресов сегментов используются специальные регистры CS, DS, ES, SS. В частности, адрес команды, которая будет выполнена следующей, хранится в паре регистров CS:IP. Сегментная организация памяти в реальном режиме работы процессора обусловлена несоответствием между длиной шины адреса (20 бит) и 16-битовым форматом хранимых данных.

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

   В защищенном режиме работы включаются в работу новые регистры, появившиеся в процессорах 286 и 386:

  • EAX, EBX, ECX, EDX, EBP, ESP, ESI, EDI, EIP, EFLAGS, которые являются 32-битными расширениями соответствующих регистров процессора 8086;
  • 16-битные селекторы сегментов CS, SS, DS, ES, FS, GS, первые четыре из них ранее использовались как сегментные регистры;
  • 16-битные регистр-указатель задачи TR и регистр-указатель на локальную таблицу сегментов текущей задачи LDTR;
  • 48-битный регистр GDTR на глобальную таблицу GDT, содержащую как дескрипторы общих сегментов, так и специальные системные дескрипторы.

   При каждом из регистров CS, SS, DS, ES, FS, GS, TR, LDTR имеются скрытые от программиста 64-битовые теневые регистры, в которые загружаются дескрипторы соответствующих сегментов.

      1. Сегментный  способ организации  распределения памяти

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

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

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

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

   Неоднократно  упоминавшийся ранее дескриптор сегмента представляет собой 64-битное описание сегмента, содержащее следующую информацию:

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

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

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

   Инициализация сегмента LDTR происходит следующим образом. Для каждой запущенной задачи строится сегмент состояния задачи (TSS, task state segment). Дескриптор каждого TSS хранится в регистре GDT, а одно из полей TSS содержит содержимое регистра LDTR. При переключении между задачами смещение дескриптора TSS помещается в регистр TR, а содержимое поля LDTR – в одноименный регистр. Этот механизм проиллюстрирован на рисунке 4.14.

     

   Содержимое  сегментных регистров (называемых в  защищенном режиме селекторами сегментов) интерпретируется согласно следующей таблице: 

        15                       3 2 1 0
        Index (номер дескриптора) TI RPL
 

   Здесь бит TI (table index) определяет, к какому из адресных пространств (глобальному или локальному) принадлежит запрашиваемый сегмент. Биты RPL (request privilege level) определяют уровень привилегий запрашиваемого сегмента. Наконец, поле Index определяет номер запрашиваемого сегмента, т.е. его смещение в соответствующей таблице дескрипторов.

   При изменении содержимого любого из селекторов сегментов происходит перемещение соответствующего дескриптора в теневой регистр, связанный с этим селектором. Это сделано для ускорения доступа к памяти и реализовано следующим образом: вначале анализируется бит TI и определяется, к какому пространству адресов принадлежит данный сегмент. Затем происходит поиск дескриптора в таблицах GDT или LDT и загрузка найденного дескриптора в соответствующий теневой сегмент.

   Формирование  физического адреса на основании  содержимого адресного регистра и селектора сегмента выполняется следующим образом. На основе анализа длины сегмента, хранящегося в дескрипторе, и смещения, задаваемого в адресном регистре, определяется ситуация «выход за границы сегмента». Затем базовый адрес начала сегмента складывается со смещением для определения т.н. линейного адреса. Если не включен механизм страничной трансляции адресов, то линейный адрес совпадает с физическим.

      1. Страничный  способ организации  памяти

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

   При реализации страничного доступа  к памяти разработчики процессора x86 приняли следующие решения:

  • длина страницы составляет 4 Кбайта;
  • для доступа к страницам используются дескрипторы страниц, содержащие 20-битовый адрес начала страницы, а также поля, описывающие страницу;
  • дескрипторы страниц объединяются в двухуровневые таблицы. На верхнем уровне находится таблица PDE (page directory entry), на нижнем – таблица PTE (page table entry). Адрес PDE хранится в специальном управляющем регистре CR3, а адреса таблиц PTE – в элементах таблицы PDE.

   В этом случае 32-битовый адрес делится  на 3 части: смещение в таблице PDE (10 бит), смещение в соответствующей таблице PTE (также 10 бит) и, наконец, смещение в странице. Механизм соответствующей двойной трансляции адресов показан на рисунке 4.15.

   

   Итак, микропроцессор позволяет иметь  для каждой задачи одну таблицу PDE и  несколько таблиц PTE. Значение адреса PDE хранится в TSS и загружается в регистр CR3, когда соответствующая задача становится активной. Это позволяет отказаться от сегментной адресации и считать, что вся задача состоит из единственного сегмента, состоящего из нескольких страниц. Этот подход, получивший название «плоской памяти», реализован в настоящее время в большинстве современных ОС.

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

      1. Механизмы защиты памяти

   При рассмотрении механизмов защиты памяти следует учесть два аспекта:

  • защиты кодов и данных одного приложения от воздействия другого приложения;
  • защиты операционной системы от воздействия запущенных ранее приложений.

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

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

   Рассмотрим  теперь вопросы организации защиты операционной системы от воздействия  запущенных приложений. Для того, чтобы  запретить пользовательским задачам модифицировать области памяти, принадлежащие самой ОС, необходимо иметь специальные средства. Для явного разграничения системных и пользовательских сегментов необходимо ввести несколько уровней (режимов) работы. В большинстве системных процессоров имеются по крайней мере 2 режима работы: пользовательский режим и режим супервизора. В последнем режиме программа может выполнять все действия и иметь доступ по любым адресам. Работа в пользовательском режиме должна быть ограничена. Например, в этом режиме недопустимо выполнение отдельных команд (ввода/вывода и др.) или обращение по определенным адресам. Можно сказать, что различные режимы работы процессора имеют различные уровни привилегий.

   В процессорах x86 имеются не два, а четыре различных уровня привилегий. Эти уровни привилегий иногда называются кольцами защиты. Наиболее привилегированные программы выполняются в кольце защиты 0, а самый низкий уровень (кольцо защиты 3) отведен для прикладных программ. Промежуточные уровни привилегий введены для большей свободы прикладных программистов. Таким образом, режим супервизора соответствует выполнению программ в кольце защиты 0.

   Каждый  дескриптор сегмента имеет в своем  составе двухбитовое поле DPL – уровень привилегии связанного с ним сегмента. При обращении к сегменту его селектор (т.е. регистр CS, DS и т.д.) содержит поле RPL – запрашиваемый уровень привилегий. DPL выполняемого сегмента кода имеет свое название - CPL.

   В пределах одной задачи могут использоваться сегменты с различными уровнями привилегий. Механизм проверки привилегий работает в ситуациях, которые можно назвать межсегментными обращениями. Это – изменение сегментов данных или стека, а также межсегментные передачи управления в случае прерываний и использования команд JMP, CALL, INT и т.д. В межсегментных обращениях участвуют два сегмента: сегмент кода, из которого идет обращение (и соответственно поле CPL) и целевой сегмент, к которому мы обращаемся (с полями RPL и DPL).

   При доступе к сегментам данных проверяется  соотношение 

CPL <= max(RPL, DPL)

Информация о работе Аппаратные средства процессора x86 для управления памятью