Начал изучать переключение задач, все проекты свои запускал под 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 из книжки, ничего своего не добавлял (проверять в чистом ДОСе).
бит 6 в байте 6 TSS дескриптора должен быть сброшен да, и еще сделай в GDT валидный LDT дескриптор, а то LDTR = 0 в TSS сегментах (TSS_0, TSS_1) скорее всего приведет (ит) к #GP
Код (Text): GDT_LDT dq 0x0000820001FFF ... SEL_flatDS equ 001000b SEL_16bitCS equ 010000b SEL_32bitCS equ 011000b SEL_32bitSS equ 100000b SEL_TSS0 equ 101000b SEL_TSS1 equ 110000b SEL_LDT equ 111000b
Это если считать с 0 ? т.е. бит отвечающий за разрядность сегмента (16/32), если я правильно понял? обресетил и его - не помогло... А насчет прописать селектор LDT в TSS, так вроде без него поисходит нормальное переключается на первую задачу, а вот обратно в задачу 0 - фигушки. Разгялдывал еще книжку Фигурнова и Финогенова, там технику переключения задач для начала разбирают безо всяких LDT, так что я пока решил не усложнять задачу себе. Народ, у кого еще не работает этот код из книжки Зубкова?
Exception13 дескриптор LDT нужен обязательно, потому как при переключении задач выполняется загрузка регистра LDTR аналогично выполнению инструкции LLDT (при этом идет кэширование дескриптора LDT в LDTR)
Баааальшое сыпасибо тов. rei3er оно заработало, действительно, сделал фиктивный LDT и подсунул его в TSS задачи на которую происходит переключение, и о чудо, при последующих переключениях task1 <> task0 все работает !!! Жаль что такие грабли в книжках не описаны. Вывод: не надо лениться, надо слушать старших
Ничего не хочу сказать - может зависит от CPU, но у меня 2 задачи по кругу успешно щёлкали при LDTR=0. Может действительно редкие грабли...
Реальные грабли, пока в реале не попробуешь, не узнаешь. То что от CPU зависит это точно, т.к. на одних компах пашет, на других - нет, представляю сколько еще таких граблей разбросано...
никто не спорит что это ошибка. только ИМХО это грабли - потому как ошибка должна быть повторяемой. а если один и тот же код на одном CPU работает, а на другои - нет, то не очень похоже на обычную ошибку.
повторю, я не спорю. но просто процессоры считаются совместимыми. и это очень странно что на одних процессорах Intel загрузка 0 в LDTR - это не критично, а на других - #GPF это ведь даже не разные производители... если бы кругом было #GPF - у меня бы удивления не вызывало
Добрый день! Пытаюсь разобраться на примерах как работает переключение, но.. та же проблема. Не совсем понял, какие именно должны быть произведены изменения в этом коде, недавно начал разбираться, еще многого не понимаю. Пожалуйста, напишите подробнее как его исправить или скиньте рабочий код с переключением задач. П.С. У меня, кстати, под Quad'ом в VMWare все работает, а на Duo нет. Не понимаю.