реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Включение мультизадачности в i386
Guest_Serg79_*
сообщение Sep 19 2007, 06:19
Сообщение #1





Guests






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

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

P.S. Если нужно больше информации, то спрашивайте.
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Sep 20 2007, 01:46
Сообщение #2


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



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

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

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

Вопрос есть, но не по теме smile.gif
А что, еще есть актуальность программирования i386 в многозадачном режиме без применения ОСи?


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
Guest_Serg79_*
сообщение Sep 20 2007, 04:10
Сообщение #3





Guests






Есть
Go to the top of the page
 
+Quote Post
vshemm
сообщение Sep 20 2007, 08:28
Сообщение #4


Частый гость
**

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



Что значит "процессор становится"? Генерируется SHUTDOWN цикл как при triple page fault?

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

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

P.S. Третий шаг лишний, т.к. процессор сам сбрасывает busy flag для текущей задачи (если переключение с помощью jmp или iret).

Сообщение отредактировал vshemm - Sep 20 2007, 08:42
Go to the top of the page
 
+Quote Post
Guest_Serg79_*
сообщение Sep 20 2007, 08:52
Сообщение #5





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") и у меня все становиться. У меня такое ощущение, что я гдето просто чегото не доделываю.
Go to the top of the page
 
+Quote Post
vshemm
сообщение Sep 20 2007, 12:10
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 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:
..........
Go to the top of the page
 
+Quote Post
Guest_Serg79_*
сообщение Sep 21 2007, 04:19
Сообщение #7





Guests






Все, спасибо всем. Уже проехали.
Go to the top of the page
 
+Quote Post
Guest_Serg79_*
сообщение Sep 21 2007, 07:07
Сообщение #8





Guests






Грабли были в том, что при сохранении контекста задачи в сегменте "TSS", регистр "cr3" не сохраняется. И при переключении обратно на эту задачу в регистр "cr3" загружались нули и все сыпалось, даже исключения не выскакивали. И еще, дальний переход с помощью команды "ljmp" на задачу которая сейчас выполняется, даже при сброшенном флаге "busy" дескрипторе задачи, так же останавливает процессор и не генерирует исключения защиты процессора.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th August 2025 - 23:10
Рейтинг@Mail.ru


Страница сгенерированна за 0.01377 секунд с 7
ELECTRONIX ©2004-2016