Файл: А. В. Гордеев А. Ю. Молчанов системное программное обеспечение электронный вариант книги издательства Питер СанктПетербург Челябинск юургу каф. Автоматика и управление 2002 2 Предисловие Настоящий учебник.pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 12.01.2024
Просмотров: 1026
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
148 1 – контроллер клавиатуры;
2 – сигнал возврата по кадру (EGA/VGA), на AT соединен с IRQ 9;
3 – обычно СОМ2/СОМ4;
4 – обычно СОМ1/СОМ3;
5 – контроллер HDD (на первых компьютерах IBM PC XT), обычно свободен на IBM PC AT и используется звуковой картой;
6 – контроллер FDD;
7 – LPT1, многими LPT-контроллерами не используется;
8 – часы реального времени с автономным питанием (RTC – real time clock);
9 – параллельна IRQ 2;
10 – не используется, то есть свободно;
11 – свободно;
12 – обычно контроллер мыши типа PS/2;
13 – математический сопроцессор;
14 – обычно контроллер IDE0 (первый канал);
Рис. 3.12. Каскадирование контроллеров прерывания
0
1
2
3
4
5
6
7
0
1
2
3
4
5
6
7
IRQ8
IRQ9
IRQ10
IRQ11
IRQ12
IRQ13
IRQ14
IRQ15
IRQ0
IRQ1
IRQ2
IRQ3
IRQ4
IRQ5
IRQ6
IRQ7
От часов и КМОП-памяти
От 8 разрядных секций слотов
бывшая линия IRQ9
От 16-разрядных секций слотов
От сопроцессора
От контроллера IDE0
От контроллера IDE1
От системного таймера
От контроллера клавиатуры
От последовательного порта COM 2(4)
От последовательного порта COM 1(3)
Sound blaster или свободно
От контроллера Floppy disk’а
От параллельного порта LPT1
149
Как известно, прерывания могут быть инициированы внешним устройством
ПК или специальной командой прерывания из программы. В любом случае, если прерывания разрешены, то выполняется следующая процедура:
1 В стек помещается регистр флагов PSW.
2 Флаг включения/выключения прерываний IF и флаг трассировки TF, нахо- дящиеся в регистре PSW, обнуляются для блокировки других маскируемых преры- ваний и исключения пошагового режима исполнения команд.
3 Значения регистров CS и IP сохраняются в стеке вслед за PSW.
4 Вычисляется адрес вектора прерывания, и из вектора, соответствующего но- меру прерывания, загружаются новые значения IP и CS.
Когда системная подпрограмма принимает управление, она может снова раз- решить маскируемые прерывания командой STI (set interrupt flag, установить флаг прерываний), которая переводит флаг IF в состояние 1, что разрешает микропро- цессору вновь реагировать на прерывания, инициируемые внешними устрой- ствами, поскольку стековая организация позволяет вложение прерываний друг в друга.
Закончив работу, подпрограмма обработки прерывания должна выполнить ин- струкцию IRET (interrupt return), которая извлекает из стека три 16-битовых значе- ния и загружает их в указатель команд IP, регистр сегмента команд CS и регистр
PSW соответственно. Таким образом, процессор сможет продолжить работу с того места, где он был прерван.
В случае внешних прерываний процедура перехода на подпрограмму обработ- ки прерывания дополняется следующими шагами:
1 Контроллер прерываний получает заявку от определенного периферийного устройства и, соблюдая схему приоритетов, генерирует сигнал INTR (interrupt re- quest), который является входным для микропроцессора.
2 Микропроцессор проверяет флаг IF в регистре PSW. Если он установлен в 1,
то переходим к шагу 3. В противном случае работа процессора не прерывается.
Часто говорят, что прерывания замаскированы, хотя правильнее говорить, что они
150
отключены. Маскируются (запрещаются) отдельные линии запроса на прерывания посредством программирования контроллера прерываний.
3 Микропроцессор генерирует сигнал INTA (подтверждение прерывания). В
ответ на этот сигнал контроллер прерывания посылает по шине данных номер пре- рывания. После этого выполняется описанная нами ранее процедура передачи управления соответствующей программе обработки прерывания.
Номер прерывания и его приоритет устанавливаются на этапе инициализации системы. После запуска ОС пользователь, как мы уже отмечали, может изменить таблицу векторов прерывания, поскольку она ему доступна.
Работа системы прерываний в защищённом режиме работы процессора
В защищённом режиме работы система прерываний действует совершенно иначе. Прежде всего, система прерываний микропроцессора i80x86 при работе в защищённом режиме вместо таблицы векторов, о которой мы говорили выше, име- ет дело с таблицей дескрипторов прерываний (IDT, interrupt descriptor table). Дело здесь не столько в названии таблицы, сколько в том, что таблица IDT представляет собой не таблицу с адресами обработчиков прерываний, а таблицу со специальны- ми системными структурами данных (дескрипторами), доступ к которой со сторо- ны пользовательских (прикладных) программ невозможен. Только сам микропро- цессор (его система прерываний) и код операционной системы могут получить доступ к этой таблице, которая представляет собой специальный сегмент, адрес и длина которого содержатся в регистре IDTR (см. рис. 3.2). Этот регистр аналогичен регистру GDTR в том отношении, что он инициализируется один раз при загрузке системы. Интересно заметить, что в реальном режиме работы регистр IDTR так же указывает адрес таблицы прерываний, но при этом, как и в процессоре i8086, каж- дый элемент таблицы прерываний (вектор) занимает всего 4 байта и содержит 32- битный адрес в формате селектор: смещение (CS:IP). Начальное значение этого ре- гистра равно нулю, но в него можно занести и другое значение. В этом случае таб- лица векторов прерываний будет находиться в другом месте оперативной памяти.
Естественно, что перед тем, как это сделать (занести в регистр IDTR новое значе- ние), необходимо подготовить саму таблицу векторов. В защищённом режиме ра- боты загрузку регистра IDTR может произвести только код с максимальным уров- нем привилегий.
151
Каждый элемент в таблице дескрипторов прерываний, о которой мы говорим уже в защищённом режиме, представляет собой 8-байтовую структуру, более по- хожую на дескриптор шлюза (gate), нежели на дескриптор сегмента.
Как мы уже знаем, в зависимости от причины прерывания процессор автома- тически индексирует таблицу прерываний и выбирает соответствующий элемент, с помощью которого и осуществляется перенаправление в исполнении кода, то есть передача управления на обработчик прерывания. Однако таблица IDT содержит только шлюзы, а не дескрипторы сегментов кода, поэтому фактически получается косвенная адресация, но с использованием рассмотренного ранее механизма защи- ты с помощью уровней привилегии. Благодаря этому пользователи уже не могут сами изменить обработку прерываний, которая предопределяется системным про- граммным обеспечением.
Дескриптор прерываний может принадлежать к одному из трех типов:
| коммутатор прерывания (interrupt gate);
| коммутатор перехвата (trap gate);
| коммутатор задачи (task gate).
При обнаружении запроса на прерывание и при условии, что прерывания сей- час разрешены, процессор действует в зависимости от типа дескриптора (коммута- тора), соответствующего номеру прерывания. Первые два типа дескриптора пре- рываний вызывают переход на соответствующие сегменты кода, принадлежащие виртуальному адресному пространству текущего вычислительного процесса. По- этому про них говорят, что обработка прерываний по этим дескрипторам осуще- ствляется под контролем текущей задачи. Последний тип дескриптора – комму- татор задачи – вызывает полное переключение процессора на новую задачу со сме- ной всего контекста в соответствии с сегментом состояния задачи (TSS). Рас- смотрим эти варианты.
1 ... 9 10 11 12 13 14 15 16 ... 37
Обработка прерываний в контексте текущей задачи
Рассмотрим рис. 3.13, поясняющий обработку прерывания в контексте теку- щей задачи. При возникновении прерывания процессор по номеру прерывания ин- дексирует таблицу IDT, то есть адрес соответствующего коммутатора определяется путем сложения содержимого поля адреса в регистре IDTR и номера прерывания,
умноженного на 8 (справа к номеру прерывания добавляются три нуля). Получен- ный дескриптор анализируется, и если его тип соответствует коммутатору trap gate
или коммутатору interrupt gate, то выполняются следующие действия.
152 1 В стек на уровне привилегий текущего сегмента кода помещаются:
| значения SS и SP, если уровень привилегий в коммутаторе выше уровня привилегий ранее исполнявшегося кода;
| регистр флагов EFLAGS;
| регистры CS и IP.
2 Если рассматриваемому прерыванию соответствовал коммутатор interrupt
gate, то запрещаются прерывания (флаг IF=0 в регистре EFLAGS). В случае комму- татора trap gate флаг прерываний не сбрасывается и обработка новых прерываний на период обработки текущего прерывания тем самым не запрещается.
3 Поле селектора из дескриптора прерываний используется для индексирова- ния таблицы дескрипторов задачи. Дескриптор сегмента заносится в теневой ре- гистр, а смещение относительно начала нового сегмента кода определяется полем смещения из дескриптора прерывания.
Рис.3.13. Схема передачи управления при прерывании в контексте текущей задачи
Регистр EIP
Регистр EFLAGS
Индекс I
TI
RPL
Регистр дескрип-
тора сегмента
Дескриптор 255
:
Дескриптор j
:
Дескриптор 1
Дескриптор 0
Прерывание
(исключение)
1
Таблица IDT
СТЕК
2,1
2,2
2,3
Дескриптор M
:
Дескриптор j
:
Таблица GDT
Дескриптор 0
Дескриптор M
:
Дескриптор j
:
Таблица LDT
Дескриптор 0
3
4
TI=0
5
153
Таким образом, в случае обработки прерываний, когда дескриптором прерыва- ний является коммутатор interrupt gate или trap gate, мы остаемся в том же вир- туальном адресном пространстве, и полной смены контекста текущей задачи не происходит. Просто мы переключаемся на исполнение другого (как правило, более привилегированного) кода, но также принадлежащего (или, правильнее сказать,
доступного) исполняемой задаче. Этот код создается системными программистами,
и прикладные программисты его просто используют. В то же время механизмы за- щиты микропроцессора позволяют обеспечить недоступность этого кода для его исправления (со стороны приложений, его вызывающих) и недоступность самой таблицы дескрипторов прерываний. Удобнее всего код обработчиков прерываний располагать в общем адресном пространстве, то есть селекторы, указывающие на такой код, должны располагаться в глобальной таблице дескрипторов.
Обработка прерываний с переключением на новую задачу
Совершенно иначе осуществляется обработка прерываний в случае, если деск- риптором прерываний является коммутатор задачи. Формат коммутатора задачи
(task gate) отличается от коммутаторов interrupt gate и trap gate, прежде всего, тем,
что в нем вместо селектора сегмента кода, на который передаётся управление, ука- зывается селектор сегмента состояния задачи (TSS). Это иллюстрируется с помо- щью рис.3.14. В результате осуществляется процедура перехода на новую задачу с полной сменой контекста, ибо сегмент состояния задачи полностью определяет но- вое виртуальное пространство и адрес начала программы, а текущее состояние прерываемой задачи аппаратно (по микропрограмме микропроцессора) сохраняет- ся в её собственном TSS.
При этом происходит полное переключение на новую задачу с вложением, то есть выполняются следующие действия:
1 Сохраняются все рабочие регистры процессора в текущем сегменте TSS, ба- зовый адрес этого сегмента берется в регистре TR (см. раздел «Адресация в 32- разрядных микропроцессорах i80x86 при работе в защищённом режиме»).
2 Текущая задача отмечается как занятая.
154 3 По селектору из Task Gate выбирается новый TSS (поле селектора помеща- ется в регистр TR) и загружается состояние новой задачи. Напомним, что загру- жаются значения регистра LDTR, EFLAGS, восемь регистров общего назначения,
указатель команды регистр EIP и шесть сегментных регистров.
4 Устанавливается бит NT (next task).
5 В поле обратной связи TSS помещается селектор прерванной задачи.
6 Значения CS:IP, взятые из нового TSS, позволяют найти и выполнить пер- вую команду обработчика прерывания.
Рис.3.14. Схема передачи управления при прерывании с переключением на новую задачу
Таким образом, коммутатор task gate даёт указание процессору произвести пе- реключение задачи, и обработка прерывания осуществляется под контролем от- дельной внешней задачи. В каждом сегменте TSS имеется селектор локальной де- скрипторной таблицы LDT, поэтому при переключении задачи процессор загружа- ет в регистр LDTR новое значение. Это позволяет обратиться к сегментам кода, ко- торые абсолютно не пересекаются с сегментами кода любых других задач, по- скольку именно локальные дескрипторные таблицы обеспечивают эффективное изолирование виртуальных адресных пространств. Новая задача начинает своё вы- полнение на уровне привилегий, определяемом полем RPL нового содержимого ре-
Номер прерывания
IDT
:
:
Дескриптор
коммутатора
задач
Селектор
:
GDT
:
:
Дескриптор
cегмента TSS
Адрес
:
Сегмент TSS
155
гистра CS, которое загружается из сегмента TSS. Достоинством этого коммутатора является то, что он позволяет сохранить все регистры процессора с помощью ме- ханизма переключения задач, тогда как коммутаторы trap gate и interrupt gate со- храняют только содержимое регистров IFLAGS, CS и IP и сохранение других реги- стров возлагается на программиста, разрабатывающего соответствующую про- грамму обработки прерывания.
Справедливости ради следует признать, что, несмотря на возможности комму- татора task gate, разработчики современных операционных систем достаточно ред- ко его используют, поскольку переключение на другую задачу требует сущест- венно больших затрат времени, а полное сохранение всех рабочих регистров часто и не требуется. В основном обработку прерываний осуществляют в контексте те- кущей задачи, так как это приводит к меньшим накладным расходам и повышает быстродействие системы.
Контрольные вопросы и задачи
Вопросы для проверки
1 Как в реальном режиме работы микропроцессоров i80x86 осуществляется преобразование виртуального адреса в физический?
2 Какие механизмы виртуальной памяти используются в защищённом режиме работы микропроцессоров i80x86?
3 Для чего в микропроцессоры i80x86 введен регистр-указатель задачи TR?
Какой он разрядности?
4 Как в микропроцессорах i80x86 реализована поддержка сегментного способа организации виртуальной памяти?
5 Что понимается под термином «линейный адрес»? Как осуществляется пре- образование линейного адреса в физический? А может ли линейный адрес быть равным физическому?
6 Что дало введение двухшаговой страничной трансляции в механизме стра- ничного способа реализации виртуальной памяти? Как разработчики микро- процессора i80386 решили проблему замедления доступа к памяти, которое при двухшаговом преобразовании адресов очень существенно?
156 7 Что дало введение виртуального режима? Как в этом режиме осуществляет- ся вычисление физического адреса?
8 Что имеется в микропроцессорах i80x86 для обеспечения защиты адресного пространства задач?
9 Что такое «уровень привилегий»? Сколько уровней привилегий имеется в микропроцессорах i80x86? Для каких целей введено такое количество уровней привилегий?
10 Что такое текущий уровень привилегий? Что такое эффективный уровень привилегий?
11 Объясните правила работы с уровнями привилегий для различных типов сегментов.
12 Поясните механизм шлюзования: для чего он предназначен, как осуществ- ляется передача управления на сегменты кода с другими уровнями привилегий.
13 Расскажите о работе системы прерываний микропроцессоров i80x86 в ре- альном режиме.
14 В чём заключаются основные принципиальные отличия работы системы прерываний микропроцессоров i80x86 в защищённом режиме по сравнению с ре- альным режимом?
15 Как осуществляется переход на программу обработки прерываний, если де- скриптор прерываний является коммутатором прерываний?
16 Как осуществляется переход на программу обработки прерываний, если де- скриптор прерываний является коммутатором перехвата?
17 Как осуществляется переход на программу обработки прерываний, если де- скриптор прерываний является коммутатором задачи?
157
ГЛАВА 4 Управление вводом/выводом и файловые системы
Необходимость обеспечить программам возможность осуществлять обмен данными с внешними устройствами и при этом не включать в каждую двоичную программу соответствующий двоичный код, осуществляющий собственно управ- ление устройствами ввода/вывода, привела разработчиков к созданию системного программного обеспечения и, в частности, самих операционных систем. Програм- мирование задач управления вводом/выводом является наиболее сложным и трудо-
ёмким, требующим очень высокой квалификации. Поэтому код, позволяющий осуществлять операции ввода/вывода, стали оформлять в виде системных библио- течных процедур; потом его стали включать не в системы программирования, а в операционную систему с тем, чтобы в каждую отдельно взятую программу его не вставлять, а только позволить обращаться к такому коду. Системы программирова- ния стали генерировать обращения к этому системному коду ввода/вывода и осу- ществлять только подготовку к собственно операциям ввода/вывода, то есть авто- матизировать преобразование данных к соответствующему формату, понятному устройствам, избавляя прикладных программистов от этой сложной и трудоёмкой работы. Другими словами, системы программирования вставляют в машинный код необходимые библиотечные подпрограммы ввода/вывода и обращения к тем сис- темным программным модулям, которые, собственно, и управляют операциями обмена между оперативной памятью и внешними устройствами. Таким образом,
управление вводом/выводом – это одна из основных функций любой ОС.
С одной стороны, в организации ввода/вывода в различных ОС много общего.
С другой стороны, реализация ввода/вывода в ОС так сильно отличается от систе- мы к системе, что очень нелегко выделить и описать именно основные принципы реализации этих функций. Проблема усугубляется ещё тем, что в большинстве ны- не используемых систем эти моменты вообще, как правило, подробно не описаны,
и исключение по этому вопросу касается только системы Linux, для которой име-
ются комментированные исходные тексты. Детально описываются функции API,