|
|
  |
Включение мультизадачности в i386 |
|
|
Guest_Serg79_*
|
Sep 19 2007, 06:19
|
Guests

|
Пытаюсь переключить i386 в мультизадачный режим, использую следующий алгоритм: 1 - подготавливаю дескриптор задачи TSS в GDT; 2 - загружаю селектор дескриптора задачи в TR ("ltr"); 3 - сбрасываю флаг занятости "B" в дескрипторе текущей задаче; 4 - делаю дальний переход на текущую задачу.
Так вот, после пункта 4 процессор становиться. Кто знает, как грамотно запустить мультизадачность на i386 подскажите.
P.S. Если нужно больше информации, то спрашивайте.
|
|
|
|
Guest_Serg79_*
|
Sep 20 2007, 04:10
|
Guests

|
Есть
|
|
|
|
|
Sep 20 2007, 08:28
|
Частый гость
 
Группа: Участник
Сообщений: 167
Регистрация: 15-08-07
Пользователь №: 29 803

|
Что значит "процессор становится"? Генерируется SHUTDOWN цикл как при triple page fault? Скорее всего дело в некорректной инициализации TS Segment. Например, дескрипторы cs, ss0 и т.д. правильные в нем? Ведь при включенном пейджинге при переключении происходит перезагрузка CR3. Также, TSS не должен пересекать границу страницы. Также, TSS и GDT для текущего таска должны быть доступны на чтение-запись. И прочее, прочее, прочее... А вообще, в том же linux отказались от аппаратного переключения задач (правда, по другим причинам). Может, Вам тоже обойтись без этого?  P.S. Третий шаг лишний, т.к. процессор сам сбрасывает busy flag для текущей задачи (если переключение с помощью jmp или iret).
Сообщение отредактировал vshemm - Sep 20 2007, 08:42
|
|
|
|
Guest_Serg79_*
|
Sep 20 2007, 08:52
|
Guests

|
Я для переключения процессора в мультизадачность использую следующий алгоритм: Код ; 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") и у меня все становиться. У меня такое ощущение, что я гдето просто чегото не доделываю.
|
|
|
|
|
Sep 20 2007, 12:10
|
Частый гость
 
Группа: Участник
Сообщений: 167
Регистрация: 15-08-07
Пользователь №: 29 803

|
А процессор то какой? А то у всяких клонов могут быть errat'ы и доп. настройка. Вот примерный код работающий: Код ; MACROS "32bit TSS segment adress" tss_32b MACRO tss_n,offtss mov eax,ebp add ax,offset &tss_n mov bx,offset &offtss mov [bx].base_l,ax rol eax,16 mov [bx].base_m,al ENDM
; Global Segment Descriptor Table structure descr struc ; limit dw 0 ; Limit (0-15) base_l dw 0 ; Base (0-15) base_m db 0 ; Base (16-23) attr_1 db 0 ; Atrributes 1 attr_2 db 0 ; Limit (16-23) + attributes 2 base_h db 0 ; Base (24-31) descr ends
; -------------------------------------------------------------------------------- ; data section here
gdt_tss_1 descr <103,0,0,89h> ; TSS_1 ;56 tss_1 db 104 dup (0) ;TSS task 1 task1_offs dw 0,56 ;Task 1 adress switch (selector 56)
; -------------------------------------------------------------------------------- ; code section here
tss_32b <tss_1>,<gdt_tss_1>;32bit adress of TSS_1
; TSS_1 initialization mov word ptr tss_1+4ch,cs ; CS mov word ptr tss_1+20h,offset task_1; IP mov word ptr tss_1+50h,ss ; SS mov word ptr tss_1+38h,512 ; SP mov word ptr tss_1+54h,ds ; DS mov word ptr tss_1+48h,es ; ES pushfd pop dword ptr tss_1+24h ; EFLAGS or dword ptr tss_1+24h,200h ; set IF flag
;Load TSS_0 in TR register mov ax,48 ltr ax ;A20 line open (himem) mov al,0d1h ; CMD for open out 64h,al mov al,0dfh ; open code out 60h,al
jmp dword ptr task1_offs
; ------------------------ task_1: ..........
|
|
|
|
Guest_Serg79_*
|
Sep 21 2007, 04:19
|
Guests

|
Все, спасибо всем. Уже проехали.
|
|
|
|
Guest_Serg79_*
|
Sep 21 2007, 07:07
|
Guests

|
Грабли были в том, что при сохранении контекста задачи в сегменте "TSS", регистр "cr3" не сохраняется. И при переключении обратно на эту задачу в регистр "cr3" загружались нули и все сыпалось, даже исключения не выскакивали. И еще, дальний переход с помощью команды "ljmp" на задачу которая сейчас выполняется, даже при сброшенном флаге "busy" дескрипторе задачи, так же останавливает процессор и не генерирует исключения защиты процессора.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|