|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Окт 20, 2003 01:19:05 Помогите, плиз, разобраться с организацией мультитаскинга на самом низком уровне, т.к. у меня самого уже чайник кипит :-( Пишу я микро ОСь. Вроде бы с основными элументами почти разобрался, по крайней мере код более или менее рабочий, но вот никак не могу вникнуть в организацию вышеупомянутого. Значит грузится ОСь с флоппа, но может и как .СОМ запускаться из под чистого доса. Переход в защищенный режим проходит нормально, инициализируется ГДТ и ИДТ, потом и прерывания включаются, все ОК, если происходит ГП, он перехватывается, высвечивается номер, пришлось даже мини дебаггер приписать, выводит регистры, запускается главная задача (бесконечный цикл) и есть еще одна маленькая задачка, которая тоже запускается, но вот тут и возникает проблема. Иногда. 1. Использую переключение на другую задачу прямым жампом по схеме: main_task: ... mov ax,task1_sel mov jmptasksel,ax jmp jmptask ... jmp main_task ; task1: ... mov ax,main_sel mov jmptasksel,ax jmp jmptask ... jmp task1 ; jmptask dd 0 jmptasksel dw 0 ; По этой схеме все работает отлично, параллельно обрабатываются прерывания от таимера и клавы. В общем все как надо, вроде бы. 2. Использую переключение на другую задачу во время обработки прерывания от таимера по следующей схеме: main_task: ... jmp main_task ; task1: ... jmp task1 ; int_timer: pushad ... mov ax,XXX_sel mov jmptasksel popad sti jmp jmptask iret ; jmptask dd 0 jmptasksel dw 0 ; Этот механизм я взял из отсюда: "Защищенный режим процессоров Intel 80286/80386/80486" © Александр Фролов, Григорий Фролов. Код программы прилагается, сам проверял у него все работает как надо, а вот у меня не получается ... При втором варианте переключении задач, само переключение как таковое происходит, но система вскоре виснет и я уверен в причине - затирание кода и данных стеком ... Но вопрос как и почему это происходит и почему это происходит тока у меня, а в примере нет. По-моему внимание стоит обратить на последователькость: jmp jmptask iret т.к. я ее не совсем понимаю. Это происходит в нутри обработчика прерывания, перед этим в стек заносятся флаги и точка возврата, потом происходит переключение на другую задачу, но стек не очищается ... Поэтому после нескольких переключениях затираются код и данны, все зависит от расположения стека и его рамера, но не это важно. Вопрос в том почему этого не происходит у Фролова? и что мне надо сделать что бы работало и у меня. В нете я не смог найти толкового описания с примерами, лучшем чем у Фролова. Все этот момент описывают очень поверхностно. Форум - моя последняя надежда. :-) 56805951__TinyOS.rar |
|
|
Дата: Окт 20, 2003 02:16:51 Переход должен быть дальний: jmp pword ptr [jmptask] |
|
|
Дата: Окт 20, 2003 02:27:11 Black_mirror дело не в этом, а может я ошибаюсь ... ведь фактически (по дебаггеру видно) задачи переключаются вот как на самом деле: jmp fword ptr jmptask iret а там я упростил, дело не в синтаксисе, а в работе проца |
|
|
Дата: Окт 20, 2003 03:03:17 Что засылается в jmptasksel в обработчике таймера? Если там у тебя константа, то так как обработчик прерывания общий, после первого переключения, второе переключение происходит на ту же задачу. Еще вроде ОС должна очищать в TSS занятости задачи. И еще имей ввиду, что для каждой задачи стек должен быть свой. В принципе TSS для многозадачности не нужен. Он нужен только для обработки всяких сбоев. Можно в обработчике прерывания от таймера сохранить все регистры в стеке и выполнть переключение на другой стек. После чего востанавливаем регисты, но уже для другой задачи. Разумеется если все задачи в одном адресном пространстве. |
|
|
Дата: Окт 21, 2003 07:44:22 Все, разобрался!!!!!! Уууррррраааааааааа!!! Получилось. Проблема х-з в чем была, но я нашел пару ошибок и все сразу заработало, а то ведь думал, хана мне с этой многозадачьностью :-). Пол недели на это убил. Black_mirror Очищать ТСС занятости не надо, это СРУ сам делает в зависимости от типа перехода (JMP, CALL, ...). По ходу дела, тема закрыта. Всем спасибо за внимание. :-) |