Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Включение мультизадачности в i386
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы
Serg79
Пытаюсь переключить i386 в мультизадачный режим, использую следующий алгоритм:
1 - подготавливаю дескриптор задачи TSS в GDT;
2 - загружаю селектор дескриптора задачи в TR ("ltr");
3 - сбрасываю флаг занятости "B" в дескрипторе текущей задаче;
4 - делаю дальний переход на текущую задачу.

Так вот, после пункта 4 процессор становиться. Кто знает, как грамотно запустить мультизадачность на i386 подскажите.

P.S. Если нужно больше информации, то спрашивайте.
haker_fox
Цитата(Serg79 @ Sep 19 2007, 15:19) *
Пытаюсь переключить i386 в мультизадачный режим, использую следующий алгоритм:
1 - подготавливаю дескриптор задачи TSS в GDT;
2 - загружаю селектор дескриптора задачи в TR ("ltr");
3 - сбрасываю флаг занятости "B" в дескрипторе текущей задаче;
4 - делаю дальний переход на текущую задачу.

Так вот, после пункта 4 процессор становиться. Кто знает, как грамотно запустить мультизадачность на i386 подскажите.

P.S. Если нужно больше информации, то спрашивайте.

Вопрос есть, но не по теме smile.gif
А что, еще есть актуальность программирования i386 в многозадачном режиме без применения ОСи?
Serg79
Есть
vshemm
Что значит "процессор становится"? Генерируется SHUTDOWN цикл как при triple page fault?

Скорее всего дело в некорректной инициализации TS Segment.
Например, дескрипторы cs, ss0 и т.д. правильные в нем? Ведь при включенном пейджинге при переключении происходит перезагрузка CR3.
Также, TSS не должен пересекать границу страницы.
Также, TSS и GDT для текущего таска должны быть доступны на чтение-запись.
И прочее, прочее, прочее...

А вообще, в том же linux отказались от аппаратного переключения задач (правда, по другим причинам). Может, Вам тоже обойтись без этого? smile.gif

P.S. Третий шаг лишний, т.к. процессор сам сбрасывает busy flag для текущей задачи (если переключение с помощью jmp или iret).
Serg79
Я для переключения процессора в мультизадачность использую следующий алгоритм:
Код
; 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") и у меня все становиться. У меня такое ощущение, что я гдето просто чегото не доделываю.
vshemm
А процессор то какой? А то у всяких клонов могут быть 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:
..........
Serg79
Все, спасибо всем. Уже проехали.
Serg79
Грабли были в том, что при сохранении контекста задачи в сегменте "TSS", регистр "cr3" не сохраняется. И при переключении обратно на эту задачу в регистр "cr3" загружались нули и все сыпалось, даже исключения не выскакивали. И еще, дальний переход с помощью команды "ljmp" на задачу которая сейчас выполняется, даже при сброшенном флаге "busy" дескрипторе задачи, так же останавливает процессор и не генерирует исключения защиты процессора.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.