Читайте также:
|
|
Лучшим способом защитить одну программу от другой при мультизадачном режиме работы является обеспечение невидимости адресного пространства памяти одной программы для другой (полная изоляция программ).
Защита памяти основана на сегментации. Сегментация реализуется путем разбиения адресного пространства на отдельные блоки – сегменты, доступ к которым производится в соответствии с определенными правилами. Сегментированная память представляет собой набор блоков, характеризуемых определенными атрибутами – такими, как расположение, тип (стек, программа, данные), размер, характеристика защиты. Максимальный размер сегмента для CPU 386+ - 4 Гб. К элементам сегмента можно обращаться с помощью различных инструкций процессора, использующих разные режимы адресации для формирования адреса в пределах сегмента. Сегменты памяти выделяются задачам операционной системой, но в реальном режиме любая задача может переопределить значения сегментных регистров, задающих положение сегмента в пространстве памяти, и "забраться" в чужую область данных или кода. В защищенном режиме прикладная программа сможет использовать только разрешенные для нее сегменты памяти.
В сегментные регистры (CS, SS, DS, ES, FS, GS) в защищенном режиме записываются не сегментные адреса, а селекторы, которые также являются 16-разрядными. (Selection – отбор).
Биты 3..15 селектора рассматриваются как номер (индекс) ячеек специальной таблицы, содержащей дескрипторы сегментов программы. (Description – описание, характеристика). Бит 2 указывает на тип нужной программе таблицы дескрипторов. (TI=1 выбор из LDT, TI=0 выбор из GDT). Биты 0 и 1 задают требуемый уровень привилегий (0, 1, 2, 3). Например RPL = 11 – кольцо прикладных программ.
Формат селектора:
INDEX | TI | RPL |
15 3 2 1 0
Таблица дескрипторов обычно задается операционной системой защищенного режима и недоступна программе!!! Каждый дескриптор в таблице имеет размер 8 байт (64 бита) и в нем хранятся все характеристики необходимые процессору для обслуживания этого сегмента. Главные характеристики – адрес сегмента, его длина, правила доступа к сегменту. Дескрипторы сегментов хранятся в памяти в виде массивов данных, которые сформированы в виде таблиц. Таблицы могут иметь размеры от 8 байт до 64 Кбайт, т.е. содержать до 8192 дескрипторов. (max размер таблицы64 Кбайт: размер 1-го дескриптора8 байт = получим 8 Кбайт дескрипторов или 8 х 1024 Кбайт = 8192 дескриптора).
Например: Таблица дескрипторов сегментов
Индексы дескрипторов (задает селектор) | Дескрипторы |
Пустой. | |
Адрес = 0. Длина 400 Кбайт. | |
Адрес = 400Кбайт. Длина 1 Мбайт. | |
Адрес = 16 Мбайт. Длина 1 Мбайт. | |
Адрес = 17 Мбайт Длина 512 байт. |
Длина сегмента задается указанием границ,
Под адрес сегмента выделяется 4 байта из 8-ми (32 бита), следовательно сегмент может располагаться в любой точке адресного пространства объемом 232 = 4 Гбайта.
Это адресное пространство носит название линейного.
Логический адрес защищенного режима представляет собой две компоненты: селектор (16 разрядов) и относительный адрес (32 разряда) и иначе называется виртуальным адресом. Селектор указывает, какой сегмент надо использовать, ссылаясь на таблицу дескрипторов. Виртуальный адрес используется программой и указывает, в какую ячейку памяти нужно обратиться за требуемой информацией.
Определим объем виртуального адресного пространства. Так как в селекторе под номер-индекс дескриптора отведено 13 бит, следовательно, в дескрипторной таблице может находиться всего 213 = 1 Кбайт х 8 = 8 Кбайт дескрипторов. Но на самом деле их в два раза больше, т.к. программа может работать с двумя дескрипторными таблицами: глобальной – GDT и локальной – LDT. GDT содержит дескрипторы. доступные всем задачам. Нулевой элемент этой таблицы процессором не используется. LDT принадлежит конкретной задаче. Итак, всего программе могут быть доступны
213 х 2 = 214 = 16 Кбайт дескрипторов, иначе – 16 Кбайт сегментов! Размер каждого сегмента определяется максимальной величиной смещения, т.е. 232 = 4 Гбайта. Находим объем виртуального адресного пространства: 16 Кбайт (количество сегментов) х 4 Гбайта (размер одного сегмента) = 64 Тбайта. Полный объем виртуального адресного пространства может быть использован только с помощью многозадачной операционной системы, которая хранит все неиспользуемые в настоящий момент сегменты на диске, загружая их в память по мере необходимости.
Реально ОП компьютера с 32-разрядной шиной адреса не может быть больше 4 Гбайт, т.е. в памяти сможет поместиться всего один 4-х Гигабайтный сегмент из более чем 16 тысяч (16 Кбайт). Сброс сегментов на диск и подкачка их с диска осуществляется операционной системой, а не программой и программист в этом не участвует.
Адрес, вычисляемый процессором на основе селектора и смещения, относится к линейному адресному пространству и называется линейным адресом памяти. Его максимальный размер равен разрядности используемой шины адреса (для 386+ 32 бита, для Р6 – 36 бит). Итак,
линейный адрес = базовый адрес сегмента (из таблицы дескрипторов) + смещение.
Линейное адресное пространство не обязательно совпадает с физическим. Для 286 процессоров линейный адрес всегда совпадает с физическим, в более поздних моделях нет. Начиная с i80386 процессоров, все процессоры i80х86 имеют встроенный страничный механизм памяти, который может быть либо включен, либо выключен, по требованию программного обеспечения. Если страничный механизм отключен, то на адресные входы процессора подается линейный адрес, который и становится физическим адресом памяти.
Если же страничный механизм включен, то линейный адрес памяти переводится в (обычно иной) адрес физической памяти с помощью обращения к двум таблицам в основной памяти. Названия этих таблиц:
§ каталог таблиц страниц (page directory table) и
§ таблица страниц (page table).
Схема преобразования виртуального адреса в физический:
Дата добавления: 2015-07-08; просмотров: 99 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
От м.Маяковская. | | | Линейный адрес |