переключение задач на разных процессорах

Тема в разделе "WASM.ASSEMBLER", создана пользователем Exception13, 17 май 2007.

  1. Exception13

    Exception13 New Member

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    66
    Адрес:
    Владимир
    Начал изучать переключение задач, все проекты свои запускал под VMware. Нормально работает переключение задач по аппаратным прерываниям от таймера RTC (IRQ8). Процедура обработки прерывания вызывается через шлюз прерывания все задачи выполняются в одном кольце 0.
    Для чистоты эксперимента запустил прогу из под ДОСа - обресетило комп (Intel 866 МГц) при запуске задачи, в то время как на другой машине (Celeron 3.07 ГГц) все работает как часы.
    Начал детально изучать причину: сделал переключение с задачи на задачу от клавиатуры, в результате: стартует задача 0, жмем кнопку - переключаемся на задачу 1, еще раз жмем - Exception10.
    В итоге отправился к книжке Зубкова Assembler для DOS Windовс и UNIX, где переключение задач происходит при запрещенных аппаратных прерываниях и переключение происходит непосредственно в коде обоих задач. В итоге получаю тот же результат: прога стабильно работает под VMware на различных машинах, работает из под чистого ДОСа на компе с Celeron'ом 3.07 ГГц, а вот на моей машине с самым что ни наесть Genuine Intel 866 - лопается как мыльный пузырь.
    Ваши соображения... потестите посмотрите, код - copy/paste из книжки, ничего своего не добавлял (проверять в чистом ДОСе).
     
  2. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    бит 6 в байте 6 TSS дескриптора должен быть сброшен
    да, и еще сделай в GDT валидный LDT дескриптор, а то LDTR = 0 в TSS сегментах (TSS_0, TSS_1) скорее всего приведет (ит) к #GP
     
  3. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    Код (Text):
    1. GDT_LDT    dq    0x0000820001FFF
    2. ...
    3. SEL_flatDS         equ   001000b
    4. SEL_16bitCS        equ   010000b
    5. SEL_32bitCS        equ   011000b
    6. SEL_32bitSS        equ   100000b
    7. SEL_TSS0           equ   101000b
    8. SEL_TSS1           equ   110000b
    9. SEL_LDT             equ   111000b
     
  4. Exception13

    Exception13 New Member

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    66
    Адрес:
    Владимир
    Это если считать с 0 ? т.е. бит отвечающий за разрядность сегмента (16/32), если я правильно понял? обресетил и его - не помогло...
    А насчет прописать селектор LDT в TSS, так вроде без него поисходит нормальное переключается на первую задачу, а вот обратно в задачу 0 - фигушки.
    Разгялдывал еще книжку Фигурнова и Финогенова, там технику переключения задач для начала разбирают безо всяких LDT, так что я пока решил не усложнять задачу себе.
    Народ, у кого еще не работает этот код из книжки Зубкова?
     
  5. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    Exception13
    дескриптор LDT нужен обязательно, потому как при переключении задач выполняется загрузка регистра LDTR аналогично выполнению инструкции LLDT (при этом идет кэширование дескриптора LDT в LDTR)
     
  6. Exception13

    Exception13 New Member

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    66
    Адрес:
    Владимир
    Баааальшое сыпасибо тов. rei3er оно заработало, действительно, сделал фиктивный LDT и подсунул его в TSS задачи на которую происходит переключение, и о чудо, при последующих переключениях task1 <> task0 все работает !!!
    Жаль что такие грабли в книжках не описаны.
    Вывод: не надо лениться, надо слушать старших :)
     
  7. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Ничего не хочу сказать - может зависит от CPU, но у меня 2 задачи по кругу успешно щёлкали при LDTR=0.
    Может действительно редкие грабли...
     
  8. Exception13

    Exception13 New Member

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    66
    Адрес:
    Владимир
    Реальные грабли, пока в реале не попробуешь, не узнаешь. То что от CPU зависит это точно, т.к. на одних компах пашет, на других - нет, представляю сколько еще таких граблей разбросано...
     
  9. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    господа, читайте спецификацию
    это не грабли, а вполне нормальная ошибка
     
  10. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    никто не спорит что это ошибка.
    только ИМХО это грабли - потому как ошибка должна быть повторяемой.
    а если один и тот же код на одном CPU работает, а на другои - нет, то не очень похоже на обычную ошибку.
     
  11. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    cppasm
    нельзя полагаться на какой-то тип процессора
    либо делаем правильно, либо ошибка/UB
     
  12. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    повторю, я не спорю.
    но просто процессоры считаются совместимыми.
    и это очень странно что на одних процессорах Intel загрузка 0 в LDTR - это не критично, а на других - #GPF
    это ведь даже не разные производители...
    если бы кругом было #GPF - у меня бы удивления не вызывало :)
     
  13. fer

    fer New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2007
    Сообщения:
    1
    Добрый день! Пытаюсь разобраться на примерах как работает переключение, но.. та же проблема. Не совсем понял, какие именно должны быть произведены изменения в этом коде, недавно начал разбираться, еще многого не понимаю. Пожалуйста, напишите подробнее как его исправить или скиньте рабочий код с переключением задач.

    П.С. У меня, кстати, под Quad'ом в VMWare все работает, а на Duo нет. Не понимаю.