OSDev
http://osdev.su/

возврат из программы (iretd)
http://osdev.su/viewtopic.php?f=6&t=788
Страница 1 из 2

Автор:  scuter [ 30 авг 2013, 07:24 ]
Заголовок сообщения:  возврат из программы (iretd)

у меня началаглючить многозадачность, как таковые процессы запускаются но когда происходит команда iretd всё останавливается,

для теста даже проверил отдельно
Код:
lgdt [GDTR]
lidt [IDTR]
jmp far 08h:this_kernel_code
this_kernel_code:
mov ax, 0x10
mov es, ax
mov ds, ax
mov fs, ax
mov gs, ax
mov      ax, sel_kernel
ltr      ax
call far sel_TSS1:0

пробовал всё это дело вразных комбинациях и в разном порядке,
но так и не могу понять почему эта штука не возвращается обратно.

Автор:  sh2ezo [ 30 авг 2013, 08:18 ]
Заголовок сообщения:  Re: возврат из программы (iretd)

Какой эмулятор и какое исключение? А ещё весь код нужен, думаю

Автор:  scuter [ 30 авг 2013, 08:58 ]
Заголовок сообщения:  Re: возврат из программы (iretd)

sh2ezo писал(а):
Какой эмулятор и какое исключение?

эмулято vbox
sh2ezo писал(а):
А ещё весь код нужен, думаю

весь код не нужен, там idt gdt и tss-ы генерируются.

Автор:  phantom-84 [ 30 авг 2013, 11:54 ]
Заголовок сообщения:  Re: возврат из программы (iretd)

Где код выхода из вложенной задачи?

Автор:  scuter [ 30 авг 2013, 13:56 ]
Заголовок сообщения:  Re: возврат из программы (iretd)

phantom-84 писал(а):
Где код выхода из вложенной задачи?

там просто iret стоит.
Код:
T_init:
mov eax, 0FF00FFh
mov ecx, 0AA00DDh
iretd
T_enter:
iretd
jmp T_enter

Автор:  phantom-84 [ 30 авг 2013, 15:29 ]
Заголовок сообщения:  Re: возврат из программы (iretd)

Ты уверен, что у тебя установлен флаг NT? Надеюсь, прерывания во вложенной задаче запрещены.

Автор:  scuter [ 31 авг 2013, 06:58 ]
Заголовок сообщения:  Re: возврат из программы (iretd)

phantom-84 писал(а):
Ты уверен, что у тебя установлен флаг NT?

я его не устанавливал, у основной задачи все флаги сброшены
phantom-84 писал(а):
Надеюсь, прерывания во вложенной задаче запрещены.

нет там прерывания разрешены, пробовал запрещять и это не помогает,


пославил исключения и попробовал вызвать какое нибудь из них ( int 10h)
после этого отключилось GDT,

поставил на таймерный IRQ многозадачность и оно тоже не работает.

Автор:  Himik [ 31 авг 2013, 11:40 ]
Заголовок сообщения:  Re: возврат из программы (iretd)

Причину ошибки быстро найдёшь с помощью отладчика Bochs. Там мы много обсуждали способы отладки
viewtopic.php?f=6&t=785

Автор:  maisvendoo [ 31 авг 2013, 13:08 ]
Заголовок сообщения:  Re: возврат из программы (iretd)

Himik писал(а):
Причину ошибки быстро найдёшь с помощью отладчика Bochs. Там мы много обсуждали способы отладки
viewtopic.php?f=6&t=785

В плане отладки, если работаешь под *nix запросто можно запилить такое - вполне себе полноценную IDE для разработки ОС, с дамами и преферансом. Вместо VMware использовать тот же Bochs или QEMU, у них же есть gdb stub на порту 1234 (только вот работали они у меня под x86, а на x86_64 в упор не хотят).

P.S.: Это можно сделать из под винды - gdb есть реализация и под win.

Автор:  phantom-84 [ 31 авг 2013, 18:25 ]
Заголовок сообщения:  Re: возврат из программы (iretd)

scuter писал(а):
phantom-84 писал(а):
Ты уверен, что у тебя установлен флаг NT?

я его не устанавливал, у основной задачи все флаги сброшены
Этот флаг устанавливается автоматически внутри вызванной задачи. И чтобы правильно сработал именно нужный iret, нужно обеспечить NT=1 в момент выполнения этого iret'а.

Цитата:
phantom-84 писал(а):
Надеюсь, прерывания во вложенной задаче запрещены.

нет там прерывания разрешены, пробовал запрещять и это не помогает,

пославил исключения и попробовал вызвать какое нибудь из них ( int 10h)
после этого отключилось GDT,

поставил на таймерный IRQ многозадачность и оно тоже не работает.
Прерывания должны быть запрещены. Иначе все прерывания и исключения должны обрабатываться внутри других вложенных задач или при NT=0. Сдается мне, вы неправильно используете аппаратную многозадачность с вложенными задачами. Скорее всего вам больше подойдет аппаратное переключение jump'ом.

Страница 1 из 2 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/