Хелпикс

Главная

Контакты

Случайная статья





Лабораторная работа №6. Переключение задач в защищённом режиме



Лабораторная работа №6. Переключение задач в защищённом режиме

1 Цель и порядок работы

Цель работы – изучить процесс переключения задач и научиться использовать его при разработке программ.

Порядок выполнения работы:

- ознакомиться с описанием лабораторной работы;

- получить задание у преподавателя по вариантам;

- написать программу, ввести программу, отладить и решить ее на ЭВМ;

- оформить отчет.

2 Краткая теория

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

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

Организация многозадачного режима, опирается на следующие аппаратные и программные средства:

- сегмент состояния задачи (Task State Segment, TSS);

- дескриптор сегмента состояния задачи;

- регистр задачи (Task Register, TR);

- дескриптор шлюза задачи (Task gate).

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

В отличие от обычных сегментов данных, TSS описывается не дескриптором сегмента памяти, а системным дескриптором, который к тому же может находиться только в таблице глобальных дескрипторов. Системные дескрипторы имеют тот же формат, что и дескрипторы памяти, отличаясь только кодом типа. Для процессоров 386 и 486 дескрипторы TSS имеют код 9. На рисунке 6.1 приведен формат дескриптора TSS для процессора 486.

Рисунок 6.1 – Формат системного дескриптора, описывающего TSS для МП 386 и 486.

В зависимости от геометрического места расположения дескриптора TSS в таблице дескрипторов, ему соответствует тот или иной селектор. Селектор TSS текущей (активной) задачи должен быть загружен в регистр задачи TR. Для исходной, главной задачи эта загрузка осуществляется программно с помощью предназначенной для этого команды ltr (load task register, загрузка регистра задач); при переключении на новую задачу программа передает процессору селектор нового TSS и перезагрузку регистра TR осуществляет процессор в ходе переключения задач.

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

Рисунок 6.2 – Основные действия при переключении задач

В процессе переключения на новую задачу (рис. 6.2) процессор сохраняет контекст текущей задачи в ее TSS и загружает новый контекст (включая селектор и относительный адрес точки входа в задачу) из TSS новой задачи.

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

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

 

Рисунок 6.3 – Формат сегмента состояния задачи

 

Сегмент состояния задачи имеет размер минимум 104 байт. В самом начале TSS предусмотрено 16-битовое поле связи, используемое при переключении задач. Для исходной, главной задачи (task_0) его содержимое не имеет значения. При переключении на новую задачу (task_l) процессор заносит в поле связи TSS новой задачи селектор TSS исходной задачи, чем создается связь между новой и старой задачами. Если новая задача, в свою очередь, переключается на следующую задачу (task_2), в поле связи TSS этой следующей задачи процессор заносит селектор TSS предыдущей задачи и т.д. В результате создается связный список вложенных задач (рис. 6.4).

 

 

Рисунок 6.4 – Цепочка связанных TSS

Команда iret, которой должна завершаться каждая вложенная задача, выполняет обратное переключение задач. В процессе этой операции процессор извлекает из поля связи TSS последней вложенной задачи селектор TSS предыдущей по порядку вложенности задачи и передаст ей управление, восстановив перед этим из TSS этой задачи ее контекст.

По адресам 04h, 0Сh и 14h относительно базы TSS располагаются кадры стеков уровней привилегий 0, 1 и 2. Содержимое этих полей загружается в регистры SS и ESP, если при переключении задачи происходит смена уровня привилегий. Задачи примеров будут работать на одном (нулевом) уровне привилегий; в этом случае поля кадров стеков не используются, а регистры SS и ESP инициализируются содержимым ячеек TSS с адресами 50h и 38h.

Регистр управления CR3 (поле TSS с адресом 1Ch) содержит базовый физический адрес каталога страниц и используется, если включено страничное преобразование. Наличие в TSS поля для регистра CR3 позволяет иметь для каждой задачи свой каталог страниц и, соответственно, свои таблицы отображения виртуальных страниц программы на физические адреса памяти. В примерах страничное преобразование выключено и регистр CR3 не используется.

Двухсловное поле TSS с адресом 20h предназначено для хранения значения указателя команд EIP. В TSS исходной задачи это поле при переключении на новую задачу заполняется процессором адресом команды, следующей за командой переключения, т.е. адресом возврата. В TSS задачи, на которую планируется осуществить переключение, поле для EIP должно быть заполнено программно смещением точки входа в задачу. При этом следует иметь в виду, что при возврате в старую задачу командой iret процессор записывает в поле для EIP завершившейся задачи в качестве "адреса возврата" адрес команды, следующей iret, т.е. адрес уже за пределами задачи. Если планируется повторное переключение на эту задачу, перед каждым переключением необходимо восстанавливать в TSS этой задачи адрес се точки входа.

Сохранение в TSS исходной задачи текущего содержимого регистра флагов EFLAGS (по адресу 24h) позволяет осуществлять переключение в любой точке задачи без потери ее работоспособности.

Участок TSS с адресами 28h…47h отведен для хранения содержимого регистров общего назначения. При переключении с исходной задачи на новую задачу процессор сохраняет в этих полях TSS исходной задачи текущее содержимое регистров, а при обратном переключении командой iret восстанавливает регистры из этих полей TSS исходной задачи, обеспечивая правильное продолжение ее выполнения. Что же касается TSS новой задачи, то, заполнив заранее поля регистров в TSS новой задачи, можно передать ей исходные параметры.

Младшие половины шести двухсловных полей, начиная с адреса 48h, отведены под содержимое сегментных регистров. Эти поля используются точно так же, как и поля регистров общего назначения.

Если новая задача использует таблицу локальных дескрипторов, ее селектор следует занести в TSS по адресу 60h.

Бит 0 слова по адресу 64h используется для отладки переключаемых задач. Если в TSS новой задачи установлен этот бит, то сразу же после переключения генерируется исключение отладки с номером 1. Остальные биты слова по адресу 64h должны быть равны 0.

Слово с адресом 66h содержит смещение битовой карты ввода-вывода, которая, при ее наличии, располагается в TSS по последующим адресам и используется для защиты портов компьютера от несанкционированного доступа. Каждый бит этой карты соответствует одному порту (вся карта, таким образом, может достигать 64 Кбит, или 8 Кбайт). Если бит, закрепленный за некоторым портом, равен 0, задача любого уровня привилегий может обращаться к этому порту. Если бит равен 1, то при обращении к порту задачей с недостаточно высоким уровнем привилегий генерируется исключение общей защиты.

При переключении на новую задачу команда iret должна инициировать довольно сложную процедуру обратного переключения через селектор TSS, хранящийся в поле связи TSS текущей задачи. Однако в обработчиках прерываний и исключений та же команда iret выполняется иначе: она просто снимает со стека три 32-битовых слова (EFLAGS, CS и EIP) и загружает их в соответствующие регистры, обеспечивая возврат из обработчика в прерванную задачу.

Режим выполнения команды iret определяется состоянием специального флага NT (Nested Task, вложенная задача), расположенного в бите 14 регистра флагов EFLAGS. Команда iret анализирует состояние флага NT и, если он сброшен, осуществляет обычный возврат из программы обработки прерывания (через стек); если же флаг NT установлен, команда iret инициирует обратное переключение задач через селектор в TSS.

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

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

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

Воспользуемся примером предыдущей лабораторной для изучения техники переключения задач. Для этого выделим строки заполнения расширенной памяти в отдельную процедуру и оформим ее в качестве задачи. Выполним в главной программе переключение на эту задачу и возврат из нее.

 

 Пример 6.1 – Техника переключения задач

; Техника переключения задач
IDEAL
P386
model small
stack 100h
;Макрос для отладки
macro debug
push ax
push bx
push cx
push dx
push ax



  

© helpiks.su При использовании или копировании материалов прямая ссылка на сайт обязательна.