Мультизадачность.

Глава 6. Регистр задачи TR.

        TR (Task Register) - это 16-разрядный системный регистр, который хранит селектор дескриптора TSS текущей задачи. Этот регистр также имеет теневую 64-разрядную компоненту, используемую только самим процессором, в которой хранится содержимое дескриптора TSS текущей задачи - это повышает производительность процессора.
        Когда происходит переключение со старой задачи на новую, процессор помещает в TSS новой задачи в поле Link содержимое регистра TR и таким образом обеспечивает связь в со старой задачей. После загрузки значений из TSS новой задачи, в регистр TR процессор записывает селектор дескриптора TSS этой новой задачи.
        Для загрузки значения в регистр TR используется команда LTR, единственным операндом которой служит 16-разрядный регистр общего назначения или переменная в памяти. Для чтения значения из этого регистра используется команда STR, которая также имеет один операнд - 16-разрядный регистр общего назначения или переменную в памяти.
        Команда LTR относится к привелегированным командам - она может выполняться только на нулевом уровне привилегий. Команду STR можно выполнить на любом уровне привилегий, так что любая программа или задача может прочитать значение этого регистра. Это может показаться странным - процессор позволяет прикладным задачам считывать "конфиденциальную" информацию - селектор дескриптора TSS, однако, на самом деле, информации значение TR программе не даёт, потому что в этом регистре находится селектор дескриптора TSS текущей задачи и задача ничего с этим сделать не сможет - переключения на саму себя запрещены.

        Регистр TR имеет, в основном, два применения:
1. Считывая значение TR, программа может определить текущую выполняемую задачу. Это может пригодится при отладке, например, для вывода на экран селектора дескриптора TSS текущей задачи, либо, для тех обработчиков прерываний и исключений, которые не являются сами задачами и выполняются в контексте текущей задачи, значение из TR позволяет определить текущую задачу.
2. Для перевода процессора в режим мультизадачности необходима загрузка селектор в регистр TR. Как именно это делается, вы увидите на примерах.

        При загрузке регистра TR в дескрипторе TSS задачи устанавливается флаг занятости B. Загрузка этого регистра связывает текущее состояние процессора с контекстом данной задачи. Для перевода процессора в режим мультизадачности, достаточно выполнить следующие действия:


; Main_TSS - это селектор некоторого определённого дескриптора TSS. mov ax,Main_TSS ltr ax ; Загружаем в регистр TR селектор ; дескриптора TSS задачи Main. Теперь текущая ; задача - это Main_TSS. ; Чистим Busy flag Main_TSS - он установился после загрузки селектора в TR mov bx,offset GDT + Main_TSS and byte ptr [ bx + 5 ],11111101b ; Переход на Main_TSS db 0eah ; Этот код эквивалентен команде FAR JMP Main_TSS:00 dw 00 dw Main_TSS ; Вот здесь процессор сохранил контекст текущей задачи, т.е. заполнил ; поля TSS текущими значениями.
; Main_TSS: ; А теперь процессор загрузил те же самые значения из TSS в регистры. ; Теперь процессор в режиме мультизадачности. ; Установка Busy flag Main_TSS - она нужна, потому что был переход с ; Main_TSS на Main_TSS командой JMP - эта команда сбрасывает флаг занятости ; старой задачи, т.е. Main_TSS. mov bx,offset GDT + Main_TSS or byte ptr [ bx + 5 ],10b

Следующая глава Оглавление Вопросы? Замечания? Пишите: sasm@narod.ru

  Copyright © Александр Семенко.
TopList

Hosted by uCoz