Я так понимаю, что при переключении задачи процессор помимо флага занятости "busy" проверяет также сам селектор и если селектор тотже что и в регистре "TR" то он не разрешает переключиться на эту задачу.
Но тогда он должен сгенерировать исключение общей защиты, но этого не происходит. Я пробовал загружать в регистр "TR" селектор дескриптора кода и процессор отрабатывал как надо, генерировал исключение общей защиты. Пробовал вызывать "LJMP $D_TSS,$0" при установленном флаге "busy", исключение общей защиты также выкидывается. А при сброшенном флаге "busy" у меня при команде "LJMP $D_TSS,$0" вообще ничего не происходит, процессор просто встает (я так думаю). Почему не выкидывается какое либо исключение?
Хотя вы можете быть и правы. Дело в том, что я пробовал загружать регистр "TR" дескриптором задачи и не выполнять дальнего перехода, в этом случае все работает как надо: прерывания работают (таймер, клавиатура), исключения работают и основной код работает.
Ладно суть такая, я хочу както удостовериться что режим мультизадачности работает, т.е. хочу посмотреть что поля структуры "TSS" заполняются при переключении задачи. Значит план у меня такой:
Код:
; Готовлю дескрипторы задач Main_TSS, Temp_TSS
; Загружаю "TR"
movl $Main_TSS, %eax
ltr %ax
; Все, мультизадачность запущена
; Переключаюсь на задачу Temp_TSS
lcall $Temp_TSS,$0
; Вот сдесь процессор заполнит поля "TSS" задачи Main_TSS,
; сбрасывает флаг "B" в дескрипторе Main_TSS, потом
; считывает значения из "TSS" задачи Temp_TSS в регистры,
; устанавливает флаг "B" в дескрипторе Temp_TSS, в поле
; "link" структуры "TSS" задачи Temp_TSS записывается
; селектор дескриптора задачи Main_TSS, устанавливает
; флаг "NT" в "eflags" и передает управление коду задачи Temp_TSS
; Вот в этой части кода, уже будут заполнены структуры "TSS"
; как задачи Main_TSS так Temp_TSS и я их могу посматреть
1: jmp 1b
; Задача Temp_TSS
.globl tmp_func
tmp_func:
nop
iret
; т.к. установлен флаг "NT" в регистре "eflags" то управление
; передается задаче чей селектор дескриптора храниться в поле
; "link" структуры "TSS" текущей выполняемой задачи.
Вот такие мысли. Как думайте, после того как задача Main_TSS встанет в бесконечном цикле "1: jmp 1b" структуры задач "TSS" будут заполнены?
И вообще правильно ли я понимаю суть вопроса и корректен ли данный алгоритм?