Содержание
- 2. Для работы мультизадачной системы нужны следующие основные факторы: 1.Каждая задача (т.е. программа) должна быть изолирована от
- 3. Сегмент состояния задачи TSS (Task State Segment) - это структура данных, которая определяет состояние (т.е. контекст)
- 4. Link (смещение 0) - это поле обратной связи. Когда процессор переключается с одной задачи на другую,
- 5. T (0-й бит по смещению 64h) - флаг трассировки, применяется для отладки задач, процессор его только
- 6. TSS определяется специальным дескриптором. Такой дескриптор является системным объектом и может находиться только в GDT (в
- 8. Дескриптор TSS определяет сегмент состояния задачи. Этот дескриптор описывает системный объект, т.к. бит S в нём
- 9. Переключение на задачу процессор производит автоматически и он сам использует дескриптор TSS и все поля из
- 10. Для того, чтобы переключиться с одной задачи на другую, нужно чтобы процессор уже выполнял задачу, т.е.
- 11. Как видите, переключение задачи довольно-таки трудоёмкий процесс и требует много времени на различные проверки и обращения
- 12. Передача управления от задачи к задаче может происходить тремя способами: 1. Одна задача вызывает другую командой
- 13. Если переключение на задачу было произведено командой FAR CALL либо оно произошло в результате прерывания, то
- 14. Дескриптор TSS содержит в байте прав доступа поле DPL (Descriptor Privilege Level). В данном случае, для
- 15. Благодаря применению мультизадачности, операционная система может контролировать операции ввода/вывода любой задачи на уровне отдельных портов. Этот
- 16. Карта разрешения ввода/вывода используется, когда процессор работает в режиме виртуального 8086, либо когда в задаче CPL
- 17. При конструировании дескриптора TSS необходимо всегда помнить, что минимально допустимый предел TSS для любой задачи равен
- 18. Регистр задачи TR. TR (Task Register) - это 16-разрядный системный регистр, который хранит селектор дескриптора TSS
- 19. Регистр TR имеет, в основном, два применения: Считывая значение TR, программа может определить текущую выполняемую задачу.
- 20. При переключении задачи с помощью прерывания или особого случая происходит автоматический возврат к прерванной задаче. Однако,
- 21. Для особых случаев и прерываний это правило не действует. Если обработчик прерывания выполнен в виде отдельной
- 22. Следует отметить, что при переключении задачи не сохраняется контекст сопроцессора, т.к., многие задачи могут не использовать
- 23. Лишь значение первых 68h байт сегмента состояния задачи строго определены. Именно это число является минимальным размером
- 24. При переключении задачи процессор может продолжить выполнение новой задачи в особом состоянии - в состоянии эмуляции
- 25. Задачи и флаги. Для управления задачами процессор использует несколько флагов: Флаг занятости B (Busy) - находится
- 26. Флаг NT (Nested Task) - находится в регистре EFLAGS. Если переключение на новую задачу было вызвано
- 27. Воздействие при переключении задачи на флаги Busy, NT, TS и поле Link.
- 34. Скачать презентацию
Для работы мультизадачной системы нужны следующие основные факторы:
1.Каждая задача (т.е.
Для работы мультизадачной системы нужны следующие основные факторы:
1.Каждая задача (т.е.
2. В мультизадачной системе должна быть одна задача - "хозяин", которая имеет высший приоритет по сравнению со всеми остальными задачами. Это нужно для того, чтобы переключать между собой задачи и управлять ресурсами, доступ к которым одновременно возможен для нескольких задач.
3. Использование разделяемых ресурсов (т.е. тех, которые разделяют между собой несколько задач, например, дисковая подсистема) должно быть корректным - либо каждая задача должна быть "в курсе" того, что кроме неё ещё кто-то может использовать этот ресурс, либо для каждого ресурса создаётся свой диспетчер - процедура или даже отдельная задача, которой принадлежит исключительное право на управление ресурсом.
4. При переключении с одной задачи на другую система должна обеспечить способ, благодаря которому состояние "старой" задачи не изменится состоянием "новой" задачи.
5. Необходимо учитывать временные характеристики - каждая задача должна подразумевать, что её выполнение может быть прервано в любой момент на неопределённое время. Этот фактор нужно учитывать при построении систем ввода/вывода, зависящих от времени, например, задача, управляющая модемом не должна терять данные по причине своего прерывания.
Сегмент состояния задачи TSS (Task State Segment) - это структура данных,
Сегмент состояния задачи TSS (Task State Segment) - это структура данных,
Link (смещение 0) - это поле обратной связи. Когда процессор переключается
Link (смещение 0) - это поле обратной связи. Когда процессор переключается
SSi:ESPi (i = 0,1,2) - это пары значений указателя на стек для разных уровней привилегий - 0, 1 и 2. Задачу можно вызывать с разных уровней привилегий и для корректной работы нужно разделение стека. Работа с этими полями - отдельная тема и пока мы использовать их не будем.
CR3 (смещение 1Ch) - это содержимое регистра CR3 для данной задачи. Как вы помните, CR3, он же PDBR, определяет параметры каталога страниц. То, что каждая задача имеет в своём TSS поле CR3 означает, что каждая задача может иметь свой "личный" набор страниц и работать по своей собственной схеме страничного преобразования. Однако, на практике, удобнее использовать одно значение для всех CR3 - это повышает надёжность и защищённость системы.
LDTR (смещение 60h) - это селектор дескриптора LDT, который используется данной задачей. Если задаче не нужна LDT, то в этом поле хранится 0 - вот здесь проявляется смысл условия, по которому нулевой дескриптор в GDT не используется - нулевой селектор означает отсутствие этого селектора. Если LDT используется, то задача может иметь свой собственный набор дескрипторов.
T (0-й бит по смещению 64h) - флаг трассировки, применяется для
T (0-й бит по смещению 64h) - флаг трассировки, применяется для
I/O Map (смещение 66h) - это адрес карты ввода вывода, точнее - смещение её начала от начала TSS. Каждая задача может иметь такую карту, в которой каждый бит определяет возможность доступа к конкретному порту - установлен - нет доступа, сброшен - есть. Таким образом реализуется защита на уровне доступа к портам ввода/вывода.
Дополнительная часть TSS (начиная со смещения 68h) - это та часть TSS, которая предусматривается программистом при создании данной задачи. Здесь должна храниться карта ввода/вывода (если она есть), здесь также может быть контекст FPU, MMX и XMM и другая информация, в зависимости от конкретной реализации ОС. Процессор непосредственно обращается только к карте ввода/вывода, к остальной информации он явно не обращается и на размер этой части не накладывается особых ограничений (т.е. не более 1Мб).
TSS определяется специальным дескриптором. Такой дескриптор является системным объектом и может
TSS определяется специальным дескриптором. Такой дескриптор является системным объектом и может
dw limit_low ; Младшая часть предела
dw address_low ; Младшая часть адреса
db address_mid ; 3-й (из 4-х) байт адреса
db access_rights ; Права доступа
db limit_hi ; Старшая часть предела
db address_hi ; Старший байт адреса
Примечание 1: Байт прав доступа access_rights имеет следующий формат:
5,6: = DPL - Уровень привилегий сегмента TSS
7: P - бит присутствия сегмента, обычно установлен в 1.
Дескриптор TSS определяет сегмент состояния задачи. Этот дескриптор описывает системный объект,
Дескриптор TSS определяет сегмент состояния задачи. Этот дескриптор описывает системный объект,
Переключение на задачу процессор производит автоматически и он сам использует дескриптор
Переключение на задачу процессор производит автоматически и он сам использует дескриптор
far jmp
far call
iret Каждая из этих команд имеет адрес перехода, состоящий из двух частей - селектора сегмента и смещения. Для того, чтобы переключиться на задачу, нужно в качестве селектора указать селектор TSS, смещение при этом будет проигнорировано процессором, потому что в самом TSS описаны все регистры задачи, в частности, CS и EIP - вот они и определят, откуда именно будет выполняться задача. Для переключения на задачу в процессоре не предусмотрено специальных команд, просто когда процессор обнаруживает, что селектор в адресе далёкого перехода указывает на дескриптор TSS, то запускается механизм переключения задач.
Процессор попросту не допустит любой задаче выйти за поставленные ей рамки, которые и определяются содержимым TSS - его дескрипторами, LDT, CR3 и картой разрешения ввода/вывода. Любая попытка нарушить условия защиты приведёт к генерации исключения и операционная система будет "знать" о нарушителе всё. Что дальше с ним делать уже определяется идеологией самой ОС
Для того, чтобы переключиться с одной задачи на другую, нужно чтобы
Для того, чтобы переключиться с одной задачи на другую, нужно чтобы
Как видите, переключение задачи довольно-таки трудоёмкий процесс и требует много времени
Как видите, переключение задачи довольно-таки трудоёмкий процесс и требует много времени
Передача управления от задачи к задаче может происходить тремя способами:
1.
Передача управления от задачи к задаче может происходить тремя способами:
1.
2. Задача переключается на другую задачу командой FAR JMP.
3. Происходит прерывание - либо аппаратное (IRQ), либо исключение и обработчик такого прерывания является отдельной задачей. Обработчик возвращает управление прерванной задаче командой IRET.
Итак, команда IRET может производить переключение задач. Как вам известно, обычное назначение этой команды - возврат из прерывания, т.е. она отличается от RET тем, что извлекает из стека ещё и регистр флагов (FLAGS, если стек - 16-разрядный, EFLAGS - если 32-разрядный). Как определить, что же именно выполнит данная команда - переключение на задачу или возврат из прерывания? Для этого в регистре флагов EFLAGS введён специальный флаг NT (Nested Task - вложенная задача). Каждый раз, когда процессор выполняет команду FAR CALL, вызывая задачу, этот флаг устанавливается в 1. При выполнении команды IRET процессор проверяет этот флаг - если он равен 1, то он переключается на предыдущую задачу (селектор которой хранится в поле Link по смещению 0 в TSS текущей задачи). Если NT = 0, происходит возврат из прерывания.
Если переключение на задачу было произведено командой FAR CALL либо оно
Если переключение на задачу было произведено командой FAR CALL либо оно
Обратите внимание на бит B (Busy) в дескрипторе TSS. Этот бит определяет занятость задачи. Каждый раз, когда процессор переключается на задачу, он устанавливает этот бит. Когда задача передаёт управление другой задаче командой FAR JMP или IRET, процессор сбрасывает флаг B в дескрипторе текущей задачи (той, из которой происходит передача управления). Передача управления командой FAR CALL не сбрасывает флаг B. Если происходит прерывание, то этот флаг в прерванной задаче также не сбрасывается. Таким образом, установленный бит B показывает, что данная задача занята, т.е. она либо работает в данный момент, либо она прервана (находится в состоянии паузы). Необходимость бита занятости B заключается в том, что процессор запрещает передачу управления занятой задаче (он генерирует исключение общей защиты). Это сделано для того, чтобы задачи не могли себя вызывать рекурсивно. Вот здесь проявляется отличие задачи от процедуры - задача, как программа, рекурсивной не бывает. Однако, при помощи манипуляций непосредственно над содержимым дескрипторов TSS (сброс и установка флага B "вручную") можно добиться переключения на занятую задачу. Это иногда бывает необходимым, в частности, при запуске мультизадачности.
Дескриптор TSS содержит в байте прав доступа поле DPL (Descriptor Privilege
Дескриптор TSS содержит в байте прав доступа поле DPL (Descriptor Privilege
CPL <= DPL, где CPL - это Current Privilege Level - текущий уровень привилегий (т.е. тот, на котором выполняется код в данный момент). Это ещё одно средство контроля целостности системы. Для системных задач поле DPL нужно устанавливать в 00b, для прикладных задач - в 11b, при этом системная задача, с DPL = 00b может переключаться на задачу с любым DPL, а, например, задача с DPL = 10b - на задачи с DPL = 10b и 11b.
Благодаря применению мультизадачности, операционная система может контролировать операции ввода/вывода любой задачи
Благодаря применению мультизадачности, операционная система может контролировать операции ввода/вывода любой задачи
в TSS в dw-поле "I/O Map" (по смещению 66h) находится базовый адрес карты ввода/вывода, этот адрес - смещение начала карты от начала TSS;
сверху карта ограничена пределом TSS, установленным в дескрипторе TSS. Каждый бит карты соответствует одному однобайтовому порту. Например:
при выводе байта в порт по адресу 21, вывод будет в этот порт и будет проверяться 21-й бит карты - это 5-й (от нуля) бит в 2-м (от нуля) байте этой карты.
Если бит в карте разрешения ввода/вывода сброшен, то вывод разрешён, если установлен - то запрещён. Таким образом, если при операции ввода/вывода двойного слова процессор обнаружит, что хотя бы один из 4-х бит в карте установлен, он сгенерирует исключение общей защиты - обращение к порту запрещено.
Карта разрешения ввода/вывода используется, когда процессор работает в режиме виртуального 8086,
Карта разрешения ввода/вывода используется, когда процессор работает в режиме виртуального 8086,
Карта разрешения ввода/вывода может располагаться по любому смещению в TSS и иметь любой размер. Если адрес карты больше, чем предел TSS, либо равен ему, то считается, что карты нет и все команды ввода/вывода (при проверке карты) будут генерировать исключение. Адрес карты должен быть не более DFFFh.
При конструировании дескриптора TSS необходимо всегда помнить, что минимально допустимый предел
При конструировании дескриптора TSS необходимо всегда помнить, что минимально допустимый предел
Регистр задачи TR.
TR (Task Register) - это 16-разрядный системный
Регистр задачи TR.
TR (Task Register) - это 16-разрядный системный
Регистр TR имеет, в основном, два применения:
Считывая значение TR, программа
Регистр TR имеет, в основном, два применения:
Считывая значение TR, программа
Для перевода процессора в режим мультизадачности необходима загрузка селектор в регистр TR. Как именно это делается, вы увидите на примерах. При загрузке регистра TR в дескрипторе TSS задачи устанавливается флаг занятости B. Загрузка этого регистра связывает текущее состояние процессора с контекстом данной задачи.
При переключении задачи с помощью прерывания или особого случая происходит автоматический
При переключении задачи с помощью прерывания или особого случая происходит автоматический
DPLTSS>=max(CPL,RPL).
Для особых случаев и прерываний это правило не действует. Если обработчик
Для особых случаев и прерываний это правило не действует. Если обработчик
Следует отметить, что при переключении задачи не сохраняется контекст сопроцессора, т.к.,
Следует отметить, что при переключении задачи не сохраняется контекст сопроцессора, т.к.,
Лишь значение первых 68h байт сегмента состояния задачи строго определены. Именно
Лишь значение первых 68h байт сегмента состояния задачи строго определены. Именно
При переключении задачи процессор может продолжить выполнение новой задачи в особом
При переключении задачи процессор может продолжить выполнение новой задачи в особом
Задачи и флаги.
Для управления задачами процессор использует несколько флагов:
Задачи и флаги.
Для управления задачами процессор использует несколько флагов:
Флаг занятости B (Busy) - находится в дескрипторе TSS, в байте прав доступа. Устанавливается всякий раз, когда происходит переключение на задачу и когда установлен, означает, что задача занята. Переключение на занятую задачу запрещено и этот флаг предназначен для предотвращения рекурсивного вызова задачи. Флаг занятости сбрасывается при переключении на другую задачу командами FAR JMP либо IRET; при переключении командой FAR CALL либо при прерывании (даже если обработчик прерывания - тоже задача) флаг не сбрасывается.
Флаг трассировки T - находится в сегменте состояния задачи TSS, это 0-й бит по смещению 64h в TSS. Если флаг установлен, то при переключении на задачу процессор сначала загрузит значения из всех полей TSS, проверит их правильность и, если не обнаружит нарушений, сгенерирует исключение отладки (прерывание 1). Если флаг сброшен, то при переключении на задачу исключение отладки не генерируется. Этот флаг предназначен для отладки задач и также может применяться для явного системного дополнения контекста задачи, например, для загрузки регистров FPU.
Флаг NT (Nested Task) - находится в регистре EFLAGS. Если переключение
Флаг NT (Nested Task) - находится в регистре EFLAGS. Если переключение
Если NT = 0, то производит обычный возврат из прерывания;
Если NT = 1, то производит переключение на предыдущую задачу, селектор дескриптора TSS которой находится в поле Link в TSS текущей задачи.
Флаг TS (Task Switched) - находится в регистре управления CR0. Этот флаг устанавливается каждый раз, когда процессор переключается на задачу и служит индикатором переключения задач. При попытке выполнить команды FPU, MMX или XMM, процессор может генерировать исключение неприсутствующего устройства (#NM - прерывание 7), что позволяет системе выполнить смену контекста FPU, MMX и XMM. Процессор позволяет пользоваться режимом виртуального 8086 только в контексте задачи и этот режим добавляет некоторые другие флаги, с которыми взаимодействует процессор в задаче
Воздействие при переключении задачи на флаги Busy, NT, TS и поле
Воздействие при переключении задачи на флаги Busy, NT, TS и поле