Предыдущий раздел | ПЕРЕКЛЮЧЕНИЕ ПРОЦЕССОРА | Следующий раздел |
Инициирование процесса диспетчером, то есть перевод этого процесса из состояния «Готов» в состояние «Задача» производится путем записи в регистры ЦП значений, образующих аппаратный контекст процесса. Так как в состав этих регистров входят и адресные регистры (например, сегментные регистры), то замена аппаратного контекста процесса приводит к замене полного контекста процесса, выполняемого на ЦП. (Полный контекст процесса образуют его аппаратный контекст и содержимое его виртуальной памяти.) В i80386 замена текущего аппаратного контекста реализована в виде неделимой аппаратной операции, называемой переключением задач. Как будет показано далее, такая операция может быть инициирована или командой jmp или командой call.
Для выполнения переключения задач ЦП должен, во-первых, записать куда-то аппаратный контекст исполнявшегося процесса, а во-вторых, записать в регистры ЦП контекст инициируемого процесса. Для запоминания аппаратных контекстов процессов используются специальные системные сегменты памяти – сегменты состояния задачи (TSS). Как и дескрипторы других системных сегментов, дескрипторы TSS находятся в GDT. Структура TSS показана на рис.47. Рассмотрим содержимое полей этой структуры.
Рис. 86. Сегмент состояния задачи TSS
База карты ввода-вывода содержит адрес-смещение этой карты относительно начала TSS. Карта ввода-вывода завершается байтом FFh. Предел сегмента TSS записывается с учетом этого байта.
Бит 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. Это происходит потому, что при переключении ЦП на контекст другого процесса, в TSS сохраняется содержимое регистров CS и IP на момент переключения. Поместив после iret команду безусловного перехода jmp на начало программы процесса, мы сделаем его вызов похожим на вызов процедуры.
Если для переключения аппаратного контекста используется команда jmp, то флаг NT в TSS нового процесса сбрасывается. Для возврата в старый процесс также используется команда jmp, в качестве операнда которой используется селектор старого TSS.
Подобно тому, как для вызова подпрограмм могут быть использованы вентили вызова, для инициирования процессов могут использоваться вентили задач. Структура вентиля задачи аналогична вентилю вызова (см. рис.45). Единственное отличие – два младших бита байта доступа в вентиле задач содержат двоичное число 01.
При переключении ЦП с одного процесса на другой процессору требуется знание не только селектора TSS нового процесса, но и селектора TSS текущего процесса (который пока еще находится на ЦП) для того, чтобы запомнить аппаратный контекст этого процесса в его TSS. Для хранения селектора TSS текущего процесса в ЦП имеется специальный 16-битный регистр – TR (Task Register).
Предыдущий раздел | В начало | Следующий раздел |