Сегментная организация памяти



В процессорах Intel 80x86 применяется сегментированная модель памяти. Для программы адресное пространство разделено на блоки, называемые сегментами. Внутри сегментов используется линейная адресация, которая осуществляется относительно начала блоков-сегментов, а их физический адрес может быть скрыт от программиста. Таким образом, логический адрес в программе имеет вид Сегмент:Смещение.

Сегмент адреса всегда хранится в специальном сегментном регистре (CS - сегмент кода, DS - сегмент данных, SS - сегмент стека, ES, FS и GS - дополнительные сегменты данных). Смещение при обращении к памяти может содержаться непосредственно в команде или в регистрах. В общем случае смещение вычисляется по формуле

Смещение = База + Индекс* Масштаб + Отклонение,

где База и Индекс выбираются из регистров, Масштаб определяет размер адресуемых данных (байт, слово, двойное или квадраслово), а Отклонение является константой, записанной прямо в команде. Вычисляемое по данной формуле смещение называют еще эффективным адресом.

Содержимое сегментного регистра зависит от режима работы процессора: в реальном режиме (в нем работает MS-DOS) сегментный регистр содержит номер параграфа, с которого в памяти размещается адресуемый сегмент, а в защищенном режиме сегментный регистр содержит селектор, с помощью которого выбирается таблица, используемая для отображения адреса, и нужная строка в ней.

В реальном режиме используется упрощенная схема трансляции адреса: физический адрес имеет разрядность 20, а сегментный регистр содержит только 16 разрядов, но так как все сегменты программы выравниваются в памяти на границу параграфа (размер параграфа - 16 байт, поэтому базовые адреса сегментов всегда кратны 16), то сегментный регистр может хранить только старшие 16 разрядов физического адреса (младшие 4 разряда всегда равны 0), т.е. фактически сегмент содержит физический адрес начала сегмента, но не в байтах, а в параграфах, и для вычисления физического адреса адресуемого элемента нет необходимости использовать таблицу (20-разрядный физический адрес, выставляемый на шину адреса, вычисляется по формуле Сегмент*16+Смещение).

Возможности адресации в реальном режиме ограничены 1 Мб (20 разрядов адреса дают возможность адресовать 220 байтов). Кроме того, реальный режим не предусматривает никаких аппаратных средств защиты. Эти недостатки преодолеваются в защищенном режиме.

В защищенном режиме для отображения логического адреса на физический используются специальные таблицы - таблицы дескрипторов, содержащие описатели (8-байтовые строки-дескрипторы) сегментов. Существуют три типа дескрипторных таблиц: глобальная таблица дескрипторов (GDT - Global Descriptor Table), локальные дескрипторные таблицы (LDT - Local Descriptor Table) и таблица дескрипторов прерываний (Interrupt Descriptor Table).

Глобальная дескрипторная таблица является главной общесистемной таблицей дескрипторов. Ее разделяют (“коллективно используют”) все задачи. Для ее локализации используется специальный регистр GDTR, в котором хранится 32-битное поле базового физического адреса начала таблицы в памяти и 16-битное поле предела с байтной грануляцией (предел равен размеру таблицы в байтах без 1, следовательно, максимальный размер таблицы равен 64 Кб и она может содержать 8192 строки-дескриптора).

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

Локальная дескрипторная таблица содержит сегменты, доступные только конкретной задаче. В мультизадачной системе каждая задача может иметь собственное адресное пространство, для его описания в дополнение к глобальной дескрипторной таблице можно построить свою локальную таблицу. Так как одновременно в системе может выполняться произвольное число задач, то невозможно хранить сведения о размещении всех локальных таблиц в отдельных регистрах. Поэтому каждая локальная дескрипторная таблица размещается в отдельном сегменте памяти, который описывается дескриптором глобальной таблицы, а для выбора этого дескриптора при выполнении задачи используется специальный 16-битный регистр LDTR, который содержит селектор нужного дескриптора в GDT.

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

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

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

Размещение таблиц в памяти и связь между ними показаны на рис.3.9.

 

LDTR     Память  
Теневой регистр LDTR      
Предел Базовый адрес   Дескриптор 0  
    Дескриптор 1  
      ..... LDT
    + Дескриптор N  
  GDTR      
Предел Базовый адрес   Дескриптор 0  
      Дескриптор 1  
      ..... GDT
    + Дескриптор LDT  
      .....  
    + Дескриптор M  
  IDTR      
Предел Базовый адрес   Дескриптор 0  
      Дескриптор 1  
      ..... IDT
  + Дескриптор K  
             

 

Рис.3.9. Дескрипторные таблицы

 

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

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

Селектор содержит три поля:

¨ Индикатор таблицы (TI), содержащийся во втором бите селектора, показывает, из какой дескрипторной таблицы выбирается строка-дескриптор (TI=0 определяет обращение к глобальной таблице дескрипторов GDT, а TI=1 - к локальной таблице LDT активной задачи);

¨ Индекс (Index) занимает 13 разрядов (с 3-го по 15-й), он определяет нужную строку, содержащую дескриптор адресуемого сегмента, в дескрипторной таблице;

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

Селектор выбирает из таблицы строку, содержащую 8-байтовый дескриптор, включающий следующие поля:

¨ Базовый адрес - 32-битное поле, определяющее начальный адрес сегмента в линейном адресном пространстве 4 Гб;

¨ Предел - 20-битное поле, определяющее границу сегмента (предел равен размеру сегмента минус 1, причем размер сегмента может задаваться как в байтах, так и в страницах), таким образом, предел задает максимальное смещение в сегменте или последнюю адресуемую страницу;

¨ Бит гранулярности или дробности G определяет, будут ли элементами сегмента байты или страницы: G=0 означает, что сегмент имеет байтную гранулярность и его размер ограничен 1 Мб, а G=1 - сегмент измеряется в страницах, а его максимальный размер равен 1 Мб * 4 Кб = 4 Гб, т.е. все адресное пространство процессора;

¨ Байт прав доступа включает в себя несколько полей:

¨ бит присутствия P устанавливается в 1, когда описываемый данным дескриптором сегмент находится (присутствует) в физической памяти; для временно неприсутствующих сегментов (выгруженных во внешнюю память при реализации виртуальной памяти) этот бит сбрасывается в 0;

¨ уровень привилегий дескриптора DPL - двухбитовое поле, определяющее уровень привилегий, установленный для области памяти, описываемой данным дескриптором (используется механизмом защиты);

¨ бит “системный” или “сегмент” S определяет назначение дескриптора: S=0 означает, что дескриптор представляет системный объект, а S=1 - дескриптор описывает сегмент памяти; конкретное назначение сегмента или дескриптора описывается полем типа;

¨ тип представлен 3-битным полем, определяющим целевое использование дескриптора или описываемого дескриптором сегмента (в нем задаются допустимые в сегменте операции: для сегментов данных могут быть разрешены операции считывания и записи, для сегментов стека должны быть разрешены и считывание и запись; для сегментов кода могут быть разрешены выполнение и считывание); таким образом, это поле определяет правила доступа к сегментам;

¨ бит доступа A автоматически устанавливается процессором в 1, когда осуществляется обращение к сегменту памяти, описываемому данным дескриптором (используется ОС для выбора сегментов для откачки на диск (свопинга) при организации виртуальной памяти);

¨ Бит размера по умолчанию D обеспечивает совместимость процессоров старших моделей с процессором 80286: D=0 означает, что находящиеся в сегменте данные имеют размер 16 бит, а D=1 - 32 бита;

¨ Бит пользователя U предназначен для использования системными программистами по их усмотрению; в нем можно, например, хранить отметку для процедур сбора мусора;

¨ Зарезервированный бит X не должен использоваться, в нем должно быть записано значение 0.

 

  Селектор в регистре   Эффективный адрес      
  Index TI 0 RPL   Смещение      
           
  Index * 8            
             
  GDTR          
  GDT        
           
  .....        
+ Дескриптор сегмента   + Адресуемый сегмент  
  .....     в памяти  
        .....  
        Адресуемый элемент  
        .....  
           
                                   

Рис.3.10. Формирование адреса при сегментной организации памяти

 

Процесс образования линейного адреса (при отключенном страничном преобразовании он является и физическим адресом) с обращением к глобальной таблице дескрипторов показан на рис.3.10.

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

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

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

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

При выявлении нарушения происходит прерывание программы, формируется нарушение общей защиты.

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

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


Дата добавления: 2016-01-05; просмотров: 15; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!