переключение через TSS

Тема в разделе "WASM.ASSEMBLER", создана пользователем 0136, 22 мар 2008.

  1. 0136

    0136 New Member

    Публикаций:
    0
    Регистрация:
    19 апр 2007
    Сообщения:
    112
    привет всем! проблема с переключение задачи, взял уже учебник по программированию, Финогенов!
    написал пример как у его в книжке (ну почти так). И тоже не работает! перегружается комп.
    Кто уже такое делал, подскажите в чём проблема (исходник прикрепил).
    Если у кого то есть такие голенькие примерчики по этой теме, то пожалуйста покажите! Очень хочется увидеть варианты :)
     
  2. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Возми Bochs и пройдись отладчиком iret- возврат из прерывания, а у тебя простой coll вызов процедуры, нужен ret или retd. Собственно переключение задачь отсутствует. Надо делать вызов на вентиль задачи который записан в gdt. И то обычно это делают по таймеру. А у тебя, даже и не знаю что. И не плохо бы коментировать код.
     
  3. 0136

    0136 New Member

    Публикаций:
    0
    Регистрация:
    19 апр 2007
    Сообщения:
    112
    Pavia, а ты можешь исправить этот пример что бы он заработал? Про коменты, там вроде нечего коментировать, всё как всегда, что там не ясно? Кстати, там у меня закоментирован второй вариант команды CALL, и он тоже безуспешен. (Pavia, если ты хочешь показать пример переключения задач через вентиль и по таймеру - не нужно).
     
  4. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Вот смотри у тебя простой Call смена tss не происходи. Вообшем надо раскоментировать второй вариант там идет вызов вентиля tss. Падает у тебя на iret. Там поставить либо бесконечный цикл либы переключение на другую задачу.
    Если бесконечный цикл то разумеется никто задачи переключать небудет. Нужно будет разрешать прерывания и делать по таймеру. Значит надо делать переключение на другую задачу.
    Задачи переключать можно по jmp и call. Либо вручную путем загрузки нужных параметров и переача управления на нужную точку через call,jmp,ret,iret.
     
  5. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Код (Text):
    1. task1_offs  dw  0
    2. task1_sel       dw  64
    Offset должен быть 32битным -- сегмент когда же 32битный?
    Код (Text):
    1. сall   dword ptr   task1_offs
    Вызов должен быть "дальний".

    +, как сказал Pavia, когда задача отработает, надо как-то восстановить eip для подготовки следующего переключения на задачу. Самое простое -- пусть в основной задаче будет бесконечный цикл, в котором после возврата из задачи корректируется eip задачи, которая отработала. Падает, думаю, не на iret, а сразу на вызове 'сall dword ptr task1_offs' т.к. в eip загружается адрес 0х40 0000, а что там находится неясно.

    И еще: в дескрипторе TSS, из которого ты переключаешься, должен стоять флаг BUSY (по коду не проверял, но на всякий случай скажу).
     
  6. 0136

    0136 New Member

    Публикаций:
    0
    Регистрация:
    19 апр 2007
    Сообщения:
    112
    при указании селектора задачи в команде КАЛЛ, смещение игнорируется тчк
    (согласен что закоментеный вариант вызова задачи правильней, тот что есть, его автор Финогенов, и думаю что ошибка в инициализации дескриптора TSS или где?)
     
  7. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    он неправильный
    чтобы он был правильный, нужно добавить 066h или сделать смещение 32-х разрядным
     
  8. 0136

    0136 New Member

    Публикаций:
    0
    Регистрация:
    19 апр 2007
    Сообщения:
    112
    превед косолапые! медведы! братья по разуму ;) креплю ещё один архив, только теперь перекомпилировал, со вторым вариантом команды калл. Кто найдёт ошибку тот будет супер тера модо кодер!
    rei3er, а ты можешь обьяснить сказаное тобой про то что смещение должно быть 32х битным?
     
  9. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    пардон, не увидел, что сегмент кода после перехода в PM 16-ти битный
     
  10. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    0136
    у тебя все TSS 32-ух битные, а сегмент кода перед переключением 16-ти битный
    в спецификации не нашел, что в этом случае должно быть, но вполне возможно исключение
     
  11. 0136

    0136 New Member

    Публикаций:
    0
    Регистрация:
    19 апр 2007
    Сообщения:
    112
    rei3er, у меня (а точнее в этом примере) все TSS (и все остальные дескрипторы) 16битные, потому что у них бит D (это 7 бит третьего слова дескриптора) равен нулю.
    ошибка появляется когда выполняется команда калл, из за чего я не знаю %)
    Есть у кого простой пример переключения задач???
     
  12. 0136

    0136 New Member

    Публикаций:
    0
    Регистрация:
    19 апр 2007
    Сообщения:
    112
    извиняюсь, вот - креплю ещё один архив, только теперь перекомпилировал, со вторым вариантом команды калл. Кто найдёт ошибку тот будет супер тера модо кодер!!!
     
  13. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    А, если сегмент кода 16битный, то тогда со смещением все в порядке. Теперь увидеть исходник бы...

    UPD: Черт, отправил, а сообщение уже есть :).
     
  14. 0136

    0136 New Member

    Публикаций:
    0
    Регистрация:
    19 апр 2007
    Сообщения:
    112
    Ребята! В частности 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 ; и ВОТ!

    Спасибо всем! Всем удачи и счастливого будущего %)
     
  15. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    у тебя они 16-ти битные
    0x89 соответствует P = 1, DPL = 0, type = 9 = 1001b, а это в свою очередь 32-ух разрядный свободный TSS
     
  16. 0136

    0136 New Member

    Публикаций:
    0
    Регистрация:
    19 апр 2007
    Сообщения:
    112
    да, это дескриптор который описывает системный обьект, называемый TSS, для 486 процессора, а для 286 он другой тчк