Я для переключения процессора в мультизадачность использую следующий алгоритм:
Код
; 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
Дело в том, что включение мультизадачного режима работы процессора не обязывает при этом иметь несколько задач и обязательно переключаться между ними, можно иметь одну задачу которая будет все время выполняться, но в тоже время это будет задачей т.к. будут задействованы регистр "TR" и использоваться структура "TSS". Так вот, я пытаюсь пока просто перенести текущий выполняемый контекст в задачу.
Если я пытаюсь загрузить в регистр "TR" не правильный селектор или селектор не указывающий на дескриптор задачи то процессор генерирует исключение общей защиты. Если не сбрасывать флаг занятости задачи "B" в дескрипторе задачи, перед дальним переходом на нее "FAR JMP TSS:0" то у меня генерируется исключение общей защиты, т.к. на рабочую задачу переключаться нельзя (рекурсивный вызов задач запрещен). Страничную организацию памяти не использую (31 бит в "CR0" не устанавливаю).
И так я дохожу до пункта 4 ("FAR JMP TSS:0") и у меня все становиться. У меня такое ощущение, что я гдето просто чегото не доделываю.