Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ОСиС_2008

.pdf
Скачиваний:
96
Добавлен:
29.05.2015
Размер:
2.65 Mб
Скачать

5. Управление оперативной пямятью и процессором

179

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Линейная

 

 

 

 

 

 

 

 

 

 

 

виртуальная память

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0

ОП

 

 

 

FFFFFFFFh

 

 

 

 

 

ОС

Каталог таблиц

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1 Гбайт

 

 

 

 

 

 

 

страниц

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

C0000000h

 

 

 

256 строк

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

768 строк

 

 

 

 

 

 

 

 

 

Прикладная

 

 

 

 

 

 

 

 

 

 

3 Гбайт

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

программа

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

00000000h

Рис. 45. Отображение линейной виртуальной памяти на реальную ОП

В-пятых, содержимое ЛВП используется ОС для выполнения записей в каталог таблиц страниц и в сами таблицы страниц (инициализация таблиц). Один каталог страниц обычно используется для адресации памяти одного процесса. При этом из 1024 строк каталога 256 строк соответствуют ОС, а 768 строк — прикладной программе. (При смене на ЦП выполняемого процесса 256 строк в каталоге не меняются, а заменяются лишь 768 строк.) Если 4 Мбайта ЛВП, соответствующие данной строке каталога, содержат какую-то информацию, то в эту строку ОС помещает указатель на соответствующую таблицу страниц. Иначе строка каталога содержит пустой указатель.

Таблица страниц, соответствующая непустой строке каталога, может содержать до 1024 строк, каждая из которых содержит дескриптор одной логической страницы программы. Так как объем одной страницы составляет 4096 байт, то максимальный объем ЛВП, соответствующий одной таблице страниц, составляет 4 Мбайт. Любая часть этого объема может соответствовать «пустым» страницам. Так как ОС ведет учет распределения ЛВП, то «пустые» страницы ей известны и она не создает для них дескрипторы в таблице страниц.

Естественно, что при создании процесса ОС распределяет ему не только ЛВП, но и реальную ОП. Не предоставив процессу хотя бы небольшое число физических страниц, нельзя обеспечить его выполнение. При этом системная часть программы процесса (256

180

Одиноков В.В., Коцубинский В.П.

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

Благодаря свопингу страниц число логических страниц процесса может быть значительно больше, чем выделенное ему число физических страниц. Для организации такого свопинга аппаратура процессора i80386 предоставляет в помощь ОС исключение отказ страницы, а также специальные биты в дескрипторах страниц, аналогичные соответствуюшим битам в дескрипторе таблицы страниц (см. рис. 44):

1)P — бит присутствия страницы в памяти (1 — страница

вОП; 0 — нет);

2)бит D — устанавливается в 1, если была выполнена запись в страницу;

3)AVL — три бита, которые ОС может использовать по своему усмотрению.

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

ЦП проверяет бит P в искомом дескрипторе страницы. Если P = 1, то выполнение программы продолжается, иначе возникает исключение «отказ страницы». Его обработчик подкачивает требуемую страницу из ВП.

Обычно страница загружается на место ранее загруженной страницы, которая или копируется из ОП на диск (если бит D = 1) или нет (бит D = 0). Для определения откачиваемой страницы могут использоваться различные критерии. Например, в качестве такой страницы может быть выбрана та, к которой было сделано наименьшее число обращений. В качестве счетчика числа обращений может быть использовано поле AVL дескриптора страницы.

Распределение ОП, основанное на страничном свопинге, обладает тем существенным достоинством по сравнению с сегментным

5. Управление оперативной пямятью и процессором 181

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

Что касается защиты информации в ОП, то аппаратура управления страницами в i80386 предоставляет для этого единственное средство: при выполнении любой машинной команды, выполняющей запись в ОП, аппаратно проверяется бит W в дескрипторе той страницы, в которую выполняется запись. При W = 1 команда записи производится, а при W = 0 возникает исключение. Эффективность данного средства существенно ниже защитных действий, выполняемых аппаратурой управления сегментами (см. п. 5.2.3).

5.4. Переключение процессора

Переключение ЦП требуется выполнять в трех случаях:

1)при выполнении межсегментных переходов в пределах текущего процесса;

2)для смены выполняемого процесса;

3)для обработки прерываний.

Все эти переключения ЦП выполняются чисто аппаратными средствами.

Роль программы сводится к выдаче команды передачи управления, инициирующей переключение ЦП.

5.4.1. Межсегментные переходы внутри процесса

Внутрисегментные переходы в защищенном режиме ЦП выполняют те же машинные команды передачи управления, что и в реальном режиме: jmp, call, ret. Для этого, как и в реальном режиме, в качестве параметра команд jmp и call задается внутрисегментное смещение, команда ret получает это смещение из стека. В результате выполнения команды заданное смещение будет записано в качестве нового содержимого указателя команды EIP. Единственное отличие: при выполнении внутрисегментного перехода в защищенном режиме ЦП проверяет, не вышел ли адрес перехода за пределы данного сегмента.

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

182 Одиноков В.В., Коцубинский В.П.

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

При межсегментной передаче управления меняется не только содержимое EIP, но и CS. Далее мы будем называть сегмент, из которого делается переход, исходным сегментом, а сегмент, в который переход делается, — целевым сегментом. В основе ограничений на межсегментные переходы лежит сравнение текущего уровня привилегий CPL (совпадает с DPL исходного сегмента) и DPL целевого сегмента. Если результаты сравнения неудовлетворительны, возникает исключение и процесс уничтожается.

Межсегментные переходы с помощью команд jmp и call можно выполнить двумя способами. Первый способ — прямой вызов целевого сегмента кода. Он предполагает задание в качестве операнда команды jmp (call) селектора этого сегмента кода. Второй способ — косвенный вызов целевого сегмента при использовании вентиля вызова. Сначала рассмотрим прямые вызовы.

Реализация межсегментных прямых переходов схематично показана на рис. 46. На выполнение прямого вызова целевого сегмента влияет бит подчинения C — бит 2 в байте доступа дескриптора целевого сегмента (см. рис. 39). Если C = 0, то целевой сегмент называется несогласованным. Такой сегмент может быть вызван только из выполняемого сегмента, имеющего не меньшие привилегии, чем целевой сегмент: CPL < DPL.

Если процесс находится в состоянии «Задача», то его программа выполняется в кольце 3, и поэтому она не может вызывать несогласованные сегменты, находящиеся в кольце 0. Это позволяет блокировать несанкционированные вызовы модулей ядра ОС. Поэтому в системе UNIX прямые межсегментные переходы используются или для передачи управления между прикладными сегментами (процесс в состоянии «Задача»), или между системными сегментами (процесс в состоянии «Ядро»). При возврате из целевого сегмента с помощью команды ret также проверяется уровень привилегий того сегмента, в который делается переход. Так как такой переход возможен только в сегмент, имеющий не лучший уровень привилегий, то это предотвращает использование команды ret для несанкционированного доступа к модулям ядра.

5. Управление оперативной пямятью и процессором

183

 

 

 

 

 

 

 

Несогласованный целевой сегмент

 

Исходный сегмент кода

 

 

 

 

 

 

 

 

 

 

 

 

 

 

S1

 

DPL1

 

C=0

 

 

 

 

 

S0

 

 

DPLo

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

l1

 

 

 

 

 

 

 

при CPL ≤ DPL1

 

 

 

. . .

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

. . .

 

 

 

 

 

 

. . .

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ret

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

call (S1 ,l1)

при DPL0

≥ CPL’

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

CPL’Å DPL1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

. . .

 

 

Согласованный целевой сегмент

 

 

 

call (S2 ,l2)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

при любом CPL

 

S2

 

DPL2

 

C=1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

l2

 

 

 

 

 

 

 

 

 

 

 

. . .

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

CPLÅ DPL0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

при DPL0 ≥ CPL”

 

 

 

. . .

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ret

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

CPLӁ DPL2

 

 

 

 

 

 

 

 

 

Рис. 46. Прямые межсегментные переходы

 

 

 

 

 

Один из способов предоставления обслуживания прикладным программам со стороны модулей ядра ОС состоит в размещении этих модулей в согласованных сегментах. Байт доступа дескриптора такого сегмента имеет бит C = 1. Согласованный сегмент можно вызывать из программных сегментов, находящихся на любом кольце защиты (см. рис. 46). Но всегда после своего вызова такой целевой сегмент будет выполняться с привилегиями исходного сегмента. Так как фактического переключения ЦП в более приоритетный режим не происходит, то данный метод имеет ограниченное применение для реализации системных вызо-

вов UNIX.

Для реализации системных вызовов удобно использовать метод косвенных переходов, основанный на применении вентилей вызова. Каждый вентиль вызова представляет собой особый системный дескриптор (рис. 47).

184

Одиноков В.В., Коцубинский В.П.

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

 

 

Резерв

 

 

Доступ

 

 

 

Селектор

 

Смещение

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

16 бит

 

 

 

8

 

8

 

16 бит

 

16 бит

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

P

 

DP

 

00

0

1

0

0

 

 

 

 

Счетчик слов

 

 

DPL

 

 

 

 

 

 

 

 

 

L

 

 

 

 

 

 

 

 

 

 

 

 

 

 

7

6

5

 

4

3

2

1

0

 

 

 

 

 

5 бит

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рис. 47. Структура вентиля вызова

На рис. 48 схематично показана реализация косвенного перехода к целевому сегменту с помощью команды call и обратного перехода к исходному сегменту с помощью команды ret. Данная схема не содержит сведений о передаче информации на вход целевого сегмента, то есть параметров соответствующего системного вызова. Для такой передачи используется следующий подход: так как исходный и целевой сегменты выполняются в разных кольцах защиты, то они используют разные стеки. При вызове целевого сегмента через вентиль вызова ЦП аппаратно копирует из стека вызывающей программы столько 16-битных слов, сколько задано в 5-битном счетчике слов в вентиле вызова. Максимальное число слов — 31.

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

5. Управление оперативной пямятью и процессором 185

Исходный сегмент кода

S0

DPLo

при CPL ≤ DPL1

. . .

call (S1 ,0)

при DPL0 ≥ CPL’

CPLÅ DPL0

Вентиль вызова

S1 DPL1

Целевой сегмент

S2 DPL2

 

 

 

 

 

l2

. . .

 

 

 

 

 

. . .

ret

CPL’Å DPL2

Рис. 48. Косвенный переход через вентиль вызова

5.4.2. Аппаратное переключение процессов

Инициирование процесса диспетчером, то есть перевод этого процесса из состояния «Готов» в состояние «Задача», производится путем записи в регистры ЦП значений, образующих аппаратный контекст процесса. Так как в состав этих регистров входят и адресные регистры (например сегментные регистры), то замена аппаратного контекста процесса приводит к замене полного контекста процесса, выполняемого на ЦП. (Полный контекст процесса образуют его аппаратный контекст и содержимое его виртуальной памяти.) В i80386 замена текущего аппаратного контекста реализована в виде неделимой аппаратной операции, называемой переключением задач. Как будет показано далее, такая операция может быть инициирована или командой jmp, или командой call.

Для выполнения переключения задач ЦП должен, во-первых, записать куда-то аппаратный контекст исполнявшегося процесса, а во-вторых, записать в регистры ЦП контекст инициируемого процесса. Для запоминания аппаратных контекстов процессов используются специальные системные сегменты памяти — сегменты состояния задачи (TSS). Как и дескрипторы других системных сегментов, дескрипторы TSS находятся в GDT. Структура TSS показана на рис. 49. Рассмотрим содержимое полей этой структуры.

186

 

Одиноков В.В., Коцубинский В.П.

31

 

 

0

 

 

 

 

 

 

 

 

База карты ввода-вывода

 

0

T

 

 

0

 

LDTR

 

 

 

0

 

GS

 

 

 

0

 

FS

 

 

 

0

 

DS

 

 

 

0

 

SS

 

 

 

0

 

CS

 

 

 

0

 

ES

 

 

 

 

EDI

 

 

 

 

ESI

 

 

 

 

EBP

 

 

 

 

ESP

 

 

 

 

EBX

 

 

 

 

EDX

 

 

 

 

ECX

 

 

 

 

EAX

 

 

 

EFLAGS

 

 

 

 

EIP

 

 

 

 

CR3

 

 

 

0

 

SS2

 

 

 

 

ESP2

 

 

 

0

 

SS1

 

 

 

 

ESP1

 

 

 

0

 

SS0

 

 

 

 

ESP0

 

 

 

0

 

LINK

 

 

 

Любая информация ОС

 

 

 

Карта ввода-вывода

 

 

 

Рис. 49. Сегмент состояния задачи TSS

 

 

База карты ввода-вывода содержит адрес-смещение этой карты относительно начала TSS. Карта ввода-вывода завершается байтом FFh. Предел сегмента TSS записывается с учетом этого байта.

5. Управление оперативной пямятью и процессором 187

Бит T — бит трассировки. Если он установлен, то переключение на данный процесс приведет к тому, что завершение каждой машинной команды процесса будет приводить к возникновению отладочного исключения, которое можно использовать в каком-то отладчике.

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

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

Аппаратура i80386 позволяет выполнять один и тот же процесс попеременно в разных кольцах защиты. (Напомним, что в системе UNIX используются два таких кольца: 0 — режим ядра, 1 — режим задачи.) Для этого процесс должен иметь несколько стеков — по одному для каждого режима. Указатель на стек для i-го кольца содержится в паре полей: SSi и ESPi. При переходе процесса в кольцо i содержимое этих полей загружается в регистры SS и ESP.

Для инициирования одного процесса из другого могут использоваться команды дальних переходов jmp и call. Для этого в качестве адреса-сегмента должен быть задан селектор того TSS, который соответствует запускаемому процессу. Если переключение ЦП происходит в результате выполнения им команды call, то в поле LINK TSS вызванного процесса помещается селектор TSS вызывающего процесса. Кроме того, устанавливается флаг NT = 1 (флаг вложенной задачи) в поле EFLAGS TSS вызванного процесса.

Для возврата из вызванного процесса в вызывающий используется команда iret. При выполнении этой команды проверяется флаг NT. Если он сброшен, то команда iret выполняется как обычно, осуществляя межсегментный переход в контексте выполняемого процесса. Если же флаг NT = 1, то производится переключение ЦП на контекст вызвавшего процесса при использовании поля LINK.

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

188

Одиноков В.В., Коцубинский В.П.

переключении ЦП на контекст другого процесса в TSS сохраняется содержимое регистров CS и IP на момент переключения. Поместив после iret команду безусловного перехода jmp на начало программы процесса, мы сделаем его вызов похожим на вызов процедуры.

Если для переключения аппаратного контекста используется команда jmp, то флаг NT в TSS нового процесса сбрасывается. Для возврата в старый процесс также используется команда jmp, в качестве операнда которой используется селектор старого TSS.

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

При переключении ЦП с одного процесса на другой процессору требуется знание не только селектора TSS нового процесса, но и селектора TSS текущего процесса (который пока еще находится на ЦП), для того чтобы запомнить аппаратный контекст этого процесса в его TSS. Для хранения селектора TSS текущего процесса в ЦП имеется специальный 16-битный регистр — TR

(Task Register).

5.4.3. Обработка прерываний

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

Допустим, что на ЦП выполняется прикладная программа, вошедшая в бесконечный цикл вследствие ошибки программирования. Тогда для прекращения выполнения этой программы достаточно нажать ту комбинацию клавиш, которая специально предназначена для этой цели в используемой ВС. Например, в UNIX это одновременное нажатие клавиш <Ctrl>&<C>, <Ctrl>&<\> или <Ctrl>&<Z>. Следствием этого является выдача интерфейсным устройством клавиатуры аппаратного сигнала прерывания, который поступает в ЦП по ОШ. Процессор прерывает выполнение зациклившейся программы и начинает выполнять