Файл: Учебнометодическое пособие Томск 2016 2 удк 004. 451(075. 8) Ббк 32. 973. 2018. 2я73 к 754 Рецензенты.pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 25.10.2023
Просмотров: 293
Скачиваний: 2
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
СОДЕРЖАНИЕ
167 принадлежащие им. Более того, основной целью сегментного управления памя- тью как раз и является защита информации в ОП.
От кого должен быть защищен сегмент нашей программы? От чужих сег- ментов кода и, иногда, от своих. Основной принцип защиты следующий. Суще- ствует ряд ограничений, при нарушении любого из которых возникает исклю- чение (внутреннее аппаратное прерывание), обработчик которого прекращает выполнение текущей программы, то есть уничтожает соответствующий про- граммный процесс. Наиболее широко используется исключение с номером
0Dh – общее нарушение защиты (GP). Перечислим ограничения, нарушения которых приводят к исключениям.
1. Ограничение числа таблиц дескрипторов сегментов, доступных про- цессу. Любой прикладной или системный обрабатывающий процесс имеет до- ступ только к двум таблицам: GDT (она доступна всем процессам) и к своей
LDT.
Несмотря на то что в GDT находятся дескрипторы для всех LDT, суще- ствующих в данный момент времени в системе, выполнить загрузку адреса
«чужой» LDT в LDTR текущий процесс не сможет из-за ограничения 6. Поэтому сегменты, описанные в «чужих» LDT, для процесса недоступны.
2. Ограничение числа доступных сегментов данных. Доступность для прикладного процесса таблицы GDT вовсе не означает доступность сегментов, дескрипторы которых находятся в GDT. Это объясняется разницей запрашивае- мого и имеющегося уровней привилегий.
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·
Уровень привилегий PL – целое число от 0 до 3, где 0 – са-
мый привилегированный уровень, 3 – самый непривилегированный
уровень.
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·
Эти уровни можно наглядно изобразить в виде колец защиты (рис. 6.9).
На этом рисунке показано, как могут быть распределены по кольцам защиты прикладные и системные программы ВС. В UNIX-системах из четырех уровней привилегий используются только два – 0 и 3. Уровень 0 присущ процессу в со- стоянии «Ядро», а уровень 3 – в состоянии «Задача».
168
Рис. 6.9 Возможное распределение программ ВС по кольцам защиты
Основной принцип ограничения числа доступных сегментов данных сле- дующий. Любой сегмент кода, выполняемый на ЦП, имеет свой уровень приви- легий CPL. В ходе этого выполнения обычно требуется использовать ячейки с данными, принадлежащие другим сегментам, каждый из которых также имеет свой уровень привилегий – DPL. Подобное использование возможно только в том случае, если выполняется условие: CPL ≤ DPL. Иначе возникает исключе- ние, обработчик которого прекращает выполнение процесса, содержащего сег- мент кода. Например, сегменты из ядра ОС могут обращаться к любой ячейке любого сегмента из GDT или LDT, так как
CPL 0
. Теперь рассмотрим вопрос о том, где хранятся уровни привилегий.
Подпрограмма ядра ОС, выполняющая системный вызов СО-
ЗДАТЬ_ПРОЦЕСС, создает для нового процесса таблицу LDT и помещает де- скриптор этой таблицы в GDT. При этом в поле DPL (см. рис. 6.1) каждого де- скриптора в LDT помещается уровень привилегий соответствующего сегмента.
Допустим теперь, что в результате диспетчеризации новый процесс переводит- ся из состояния «Готов» в состояние «Задача». Иными словами, программа процесса начинает выполняться на ЦП. Подобная передача управления про- грамме производится загрузкой в регистр CS индекса дескриптора сегмента ко- да в таблице LDT. Кроме того, в качестве поля RPL в CS (см. рис. 5.1) копиру- ется DPL из дескриптора сегмента кода. Теперь до тех пор, пока выполняются машинные команды из этого сегмента кода, его RPL является текущим уровнем
169 привилегий CPL. Следует отметить, что прикладной процесс не может изме- нить свой CPL, то есть его программа не может выполнить запись в поле RPL регистра CS. Но прочитать это поле программа всегда может.
Теперь допустим, что сегмент кода нашего процесса хочет обрабатывать какие-то ячейки из какого-то сегмента данных. Тогда одна из команд должна загрузить индекс, соответствующий положению в LDT или в GDT дескриптора этого сегмента, в соответствующий сегментный регистр данных, например в DS. Что касается поля RPL (см. рис. 5.1) в этом регистре, то записываемое ту- да значение называется уровнем запрашиваемых привилегий. Команда загруз- ки в сегментный регистр данных (DS, ES и т. д.) индекса и RPL завершится успешно только в том случае, если выполняется условие:
(DPL)
в дескрипторе сегмента данных
> max [(CPL)
в CS
,(RPL)
в DS
].
При этом очевидно, что запрашивать уровень привилегий лучше, чем
CPL
, бесполезно. Если указанное условие не выполняется, то загрузка в DS
(и выполнение всей программы) завершится исключением GP.
3. Подобно тому, как процессу в состоянии «Задача» доступны не все сегменты данных, перечисленные в GDT, ему доступны и далеко не все сегмен- ты кода. Иначе бесконтрольные вызовы подпрограмм ядра ОС могут привести к разрушению как самой ОС, так и прикладных программ.
С другой стороны, полный запрет вызова подпрограмм ядра прикладной программой также не допустим, так как программа должна иметь возможность обращаться к ОС с целью получения помощи от нее. Для этого прикладной программе должны быть доступны те подпрограммы ядра ОС, которые специ- ально предназначены для обслуживания прикладных программ. Так как про- цесс в состояниях «Задача» и «Ядро» использует разные сегменты кода, то, во-первых, межсегментные переходы обязательно должны существовать, а во-вторых, эти переходы должны быть ограничены.
4. Ограничение длины доступных сегментов. После того как загрузка сегментного регистра завершилась успешно, процесс (а точнее – его сегмент кода) получает доступ к ячейкам этого сегмента. Для адресации искомой ячей- ки при этом используется регистр-смещение. Меняя его содержимое, можно обрабатывать различные ячейки сегмента.
Как показано на рисунке 6.1, одно из полей дескриптора сегмента содер- жит предел – размер соответствующего сегмента. Попытка использовать в те-
170 кущей команде адрес-смещение, превышающее предел сегмента, неизбежно приведет к исключению.
5. Ограничение формы доступа к сегменту. Основные формы доступа:
«чтение», «запись» и «выполнение». Для сегментов данных возможными фор- мами доступа являются «чтение» и «запись», а для сегмента кода – «выполне- ние» и «чтение».
Для конкретного сегмента могут быть разрешены не все возможные фор- мы доступа. Для этого в дескрипторе сегмента кода (см. рис. 6.2) бит R разре- шает (
R 1
) или запрещает (R=0) чтение из сегмента кода. В дескрипторе сег- мента данных (см. рис. 6.3) бит W разрешает (
W 1
) или запрещает (
W 0) запись в сегмент данных.
6. Ограничение множества допустимых машинных команд. Находясь в сегменте кода с уровнем привилегий CPL, мы можем выполнять только такие команды, которые соответствуют этому уровню.
В частности, при
CPL 0 допустимы все команды используемого ЦП.
Некоторые из этих команд разрешены только в этом приоритетном кольце. Они называются привилегированными командами.Перечислим некоторые из их:
lgdt – загрузка GDTR;
lldt – загрузка LDTR;
lmsw – загрузка регистра состояния машины (это 16 младших битов регистра CR0);
hlt – останов ЦП.
Кроме привилегированных команд выполнение некоторых других команд также ограничено. Сюда относятся команды ввода-вывода и команды для рабо- ты с флагом разрешения прерываний IF. Контроль над этим флагом очень ва- жен, так как программа, сбросившая его и вошедшая в бесконечный цикл, в принципе не может быть снята с ЦП никаким способом, кроме перезагрузки
ОС. Это обусловлено тем, что завершение процесса с зациклившейся програм- мой выполняет или обработчик прерываний клавиатуры (при нажатии специ- альной комбинации клавиш), или обработчик прерываний таймера (по истече- нии кванта времени процесса). Так как прерывания обоих этих типов являются маскируемыми, то при
IF 0 они запрещены.
Изменение флага IF выполняют две команды: sti и cli. Их примене- ние в программе процесса допустимо при выполнении условия: CPL ≤ IOPL, где IOPL – число в битах 12 и 13 регистра флагов EFLAGS. Программы, рабо-
171 тающие не в нулевом кольце, не могут модифицировать поле IOPL. Поэтому при выполнении команд, загружающих EFLAGS (команды iret и popf) не в нулевом кольце, поле IOPL не модифицируется. При этом также не меняется флаг IF. Команды iret и popf являются примерами чувствительных ко-
манд, функции которых зависят от текущего уровня привилегий процесса.
7. Ограничение доступа к периферийным устройствам. Доступ к ПУ про- грамма осуществляет через порты, используя команды in, out, ins и outs.
Контроль над использованием этих команд важен для защиты не только ин- формации, расположенной на ПУ (например, на диске), но и информации в ОП.
Это обусловлено тем, что с помощью этих команд можно, например, перепро- граммировать контроллеры прерываний и прямого доступа в память (ПДП), что откроет путь к непосредственной модификации содержимого ОП по реальным адресам.
Ограничение использования команд ввода-вывода основано на совмест- ном использовании упомянутого выше поля IOPL в регистре флагов EFLAGS и битовой карты ввода-вывода. Битовая карта ввода-вывода – битовая строка, в которой каждый бит соответствует одному порту ввода-вывода. Причем но- мер бита в карте равен номеру (адресу) порта. Каждому процессу назначается своя карта ввода-вывода.
Если CPL ≤ IOPL, то на операции ввода-вывода не накладывается ника- ких ограничений. Если CPL > IOPL, то ЦП проверяет тот бит в карте ввода- вывода процесса, который соответствует адресуемому порту. Если этот бит ра- вен 0, то текущая команда ввода-вывода выполняется. Иначе возникает исклю- чение. Оно возникает и в том случае, если адресуемому порту не соответствует никакой бит в карте ввода-вывода (из-за ее короткой длины) [9].
6.3 Линейная виртуальная память
6.3.1 Преобразование адресов
Если включена аппаратура управления страницами (установкой в 1 стар- шего бита регистра CR0), то ОС записывает в дескрипторы сегментов не ли- нейные реальные адреса, а линейные виртуальные адреса. Вопрос о том, как ОС выбирает эти адреса, мы рассмотрим позже, а пока остановимся на преобразо- вании этих адресов в реальные аппаратурой управления страницами.
172
Допустим, что вся реальная ОП разделена на участки фиксированной длины, называемые физическими страницами. (При использовании в качестве
ЦП i80386 длина страницы составляет 4 096 байтов.) Программы, выполняемые на ЦП, также считаются разделенными на участки этой же длины, называемые
логическими страницами. Преобразование логической страницы в физическую выполняют совместно ОС и аппаратура управления страницами. При этом ОС выполняет инициализацию таблиц, используемых для аппаратного преобразо- вания линейных адресов, а также выполняет главную часть страничного сво- пинга.
Допустим пока, что свопинг не требуется, так как каждой логической странице соответствует своя физическая страница. В этом случае каждый ли- нейный виртуальный адрес, выдаваемый аппаратурой управления сегментами, преобразуется в реальный адрес по схеме на рисунке 6.10. Так как длина ли- нейного виртуального адреса 32 бита, то общий объем линейного виртуального адресного пространства составляет 2 32
= 4 Г (байт).
Рис. 6.10 Преобразование линейного виртуального адреса в реальный
Как видно из рисунков 6.6, 6.7, 32 бита линейного адреса аппаратно раз- деляются на три части. Старшие 10 бит используются как индекс поиска (здесь индекс – номер строки) в таблице, называемой каталогом таблиц страниц.
Каждая строка этой таблицы содержит дескриптор одной из таблиц страниц.
Максимальное число строк (дескрипторов) в таблице-каталоге – 1 024 (2 10
).
Причем количество самих каталогов не ограничено. В любой момент времени существует каталог, называемый текущим каталогом(не путатьс текущим ка- талогом файлов). Начальный реальный адрес этого каталога содержится в реги-
173 стре CR3. Смена содержимого этого регистра приводит к смене текущего ката- лога.
На рисунке 6.11 приведена структура дескриптора таблицы страниц. По- ясним содержание полей этого дескриптора:
1) в битах 12–31 находятся старшие 20 битов реального адреса в ОП таб- лицы страниц, соответствующей дескриптору. Младшие 12 битов это- го адреса таблицы страниц всегда равны нулю. Поэтому в ОП таблица страниц может находиться только по адресу, кратному числу 4 096
(2 12
), то есть на границе физической страницы;
2) AVL – биты, используемые ОС по своему усмотрению;
3) D – бит устанавливается в 1, если была выполнена запись в таблицу страниц;
4) A – бит доступа, он устанавливается в 1 ЦП перед выполнением опе- рации чтения (записи) из таблицы (в таблицу) страниц;
5) U – бит принадлежности таблицы страниц (0 – таблица страниц ядра,
1 – таблица страниц прикладной программы);
6) W – бит разрешения записи (1 – запись в таблицу страниц разрешена,
0 – запись не разрешена);
7) P – бит присутствия в памяти (1 – таблица страниц находится в ОП,
0 – нет).
Рис. 6.11 Структура дескриптора таблицы страниц
Следующие 10 битов линейного адреса являются индексом в таблице страниц, выбранной с помощью старших десяти битов адреса. Таблица страниц состоит из 1 024 дескрипторов страниц, каждый из которыхописывает одну логическую страницу. Дескриптор страницы имеет тот же состав полей, что и дескриптор таблицы страниц (см. рис. 6.7). Единственное уточнение: старшие
20 битов дескриптора страницы содержат 20 старших битов (из 32) начального реального адреса соответствующей физической страницы.
Младшие 12 битов линейного виртуального адреса (см. рис. 6.6) содержат смещение адресуемой ячейки ОП относительно начала страницы. В результате аппаратного суммирования этого смещения с начальным реальным адресом со-
174 ответствующей физической страницы получается искомый реальный адрес ячейки ОП.
1 ... 12 13 14 15 16 17 18 19 ... 23