привет всем! проблема с переключение задачи, взял уже учебник по программированию, Финогенов! написал пример как у его в книжке (ну почти так). И тоже не работает! перегружается комп. Кто уже такое делал, подскажите в чём проблема (исходник прикрепил). Если у кого то есть такие голенькие примерчики по этой теме, то пожалуйста покажите! Очень хочется увидеть варианты
Возми Bochs и пройдись отладчиком iret- возврат из прерывания, а у тебя простой coll вызов процедуры, нужен ret или retd. Собственно переключение задачь отсутствует. Надо делать вызов на вентиль задачи который записан в gdt. И то обычно это делают по таймеру. А у тебя, даже и не знаю что. И не плохо бы коментировать код.
Pavia, а ты можешь исправить этот пример что бы он заработал? Про коменты, там вроде нечего коментировать, всё как всегда, что там не ясно? Кстати, там у меня закоментирован второй вариант команды CALL, и он тоже безуспешен. (Pavia, если ты хочешь показать пример переключения задач через вентиль и по таймеру - не нужно).
Вот смотри у тебя простой Call смена tss не происходи. Вообшем надо раскоментировать второй вариант там идет вызов вентиля tss. Падает у тебя на iret. Там поставить либо бесконечный цикл либы переключение на другую задачу. Если бесконечный цикл то разумеется никто задачи переключать небудет. Нужно будет разрешать прерывания и делать по таймеру. Значит надо делать переключение на другую задачу. Задачи переключать можно по jmp и call. Либо вручную путем загрузки нужных параметров и переача управления на нужную точку через call,jmp,ret,iret.
Код (Text): task1_offs dw 0 task1_sel dw 64 Offset должен быть 32битным -- сегмент когда же 32битный? Код (Text): сall dword ptr task1_offs Вызов должен быть "дальний". +, как сказал Pavia, когда задача отработает, надо как-то восстановить eip для подготовки следующего переключения на задачу. Самое простое -- пусть в основной задаче будет бесконечный цикл, в котором после возврата из задачи корректируется eip задачи, которая отработала. Падает, думаю, не на iret, а сразу на вызове 'сall dword ptr task1_offs' т.к. в eip загружается адрес 0х40 0000, а что там находится неясно. И еще: в дескрипторе TSS, из которого ты переключаешься, должен стоять флаг BUSY (по коду не проверял, но на всякий случай скажу).
при указании селектора задачи в команде КАЛЛ, смещение игнорируется тчк (согласен что закоментеный вариант вызова задачи правильней, тот что есть, его автор Финогенов, и думаю что ошибка в инициализации дескриптора TSS или где?)
превед косолапые! медведы! братья по разуму креплю ещё один архив, только теперь перекомпилировал, со вторым вариантом команды калл. Кто найдёт ошибку тот будет супер тера модо кодер! rei3er, а ты можешь обьяснить сказаное тобой про то что смещение должно быть 32х битным?
0136 у тебя все TSS 32-ух битные, а сегмент кода перед переключением 16-ти битный в спецификации не нашел, что в этом случае должно быть, но вполне возможно исключение
rei3er, у меня (а точнее в этом примере) все TSS (и все остальные дескрипторы) 16битные, потому что у них бит D (это 7 бит третьего слова дескриптора) равен нулю. ошибка появляется когда выполняется команда калл, из за чего я не знаю %) Есть у кого простой пример переключения задач???
извиняюсь, вот - креплю ещё один архив, только теперь перекомпилировал, со вторым вариантом команды калл. Кто найдёт ошибку тот будет супер тера модо кодер!!!
А, если сегмент кода 16битный, то тогда со смещением все в порядке. Теперь увидеть исходник бы... UPD: Черт, отправил, а сообщение уже есть .
Ребята! В частности rei3er, Pavia, Mika0x65 и всем остальным! Попрошу меня извинить, а также прошу извинения у товарища Финогенова! Нашёл ошибку - была неправильная инициализация сегмента TSS2 (по привычке, когда печатал, скопировал и недоисправил) mov tss1+4ch, 40;cs text1 mov tss1+20h, offset task1;eip mov tss1+50h, 24;ss mov tss1+38h, 200;esp mov tss1+54h, 8;ds mov tss1+48h, 32;es mov tss2+4ch, 48;cs text2 mov tss2+20h, offset task2 mov tss2+50h, 24 mov tss1+38h, 400 ; ВОТ mov tss1+54h, 8 ; И ВОТ mov tss1+48h, 32 ; и ВОТ! Спасибо всем! Всем удачи и счастливого будущего %)
у тебя они 16-ти битные 0x89 соответствует P = 1, DPL = 0, type = 9 = 1001b, а это в свою очередь 32-ух разрядный свободный TSS
да, это дескриптор который описывает системный обьект, называемый TSS, для 486 процессора, а для 286 он другой тчк