OSDev http://osdev.su/ |
|
поток double fault exceptions http://osdev.su/viewtopic.php?f=6&t=320 |
Страница 3 из 5 |
Автор: | SII [ 29 апр 2010, 10:27 ] |
Заголовок сообщения: | Re: поток double fault exceptions |
chizh писал(а): А в обработчике прерываний делается команда EOF? Если нет, то поэтому и не приходит больше прерываний, и не возникает больше ошибок. Ещё должны быть замаскированы прерывания контролдлера 8059A. 8259 ;) Но, по большому счёту, всё опять-таки сводится к полной явной инициализации всего железа без расчёта на то, что что-то как-то сделано автоматически или ещё кем-нибудь. |
Автор: | ZarathustrA [ 29 апр 2010, 13:19 ] |
Заголовок сообщения: | Re: поток double fault exceptions |
Конкретно для данного исключения прерывания eoi не делается. Кстати вопрос: как можно на ходу отличать программные прерывания от аппаратных, кроме как просмотром маски ISR? |
Автор: | SII [ 29 апр 2010, 14:08 ] |
Заголовок сообщения: | Re: поток double fault exceptions |
Никак. Один из ляпов всех интеловских архитектур, начиная с 8008. |
Автор: | phantom-84 [ 29 апр 2010, 15:43 ] |
Заголовок сообщения: | Re: поток double fault exceptions |
ZarathustrA писал(а): Фишка в том, что по-умолчанию, при запуске системе все прерывания в IO APIC-е замаскированы. Им просто неоткуда появляться. Их не должно быть. А ты в курсе, что I/O APIC может быть вообще не задействован в обработке прерываний? В PIC-режиме сигналы всегда направляются, минуя I/O APIC, а в Virtual Wire могут направляться, минуя I/O APIC.ZarathustrA писал(а): Вторая фишка в том, что по-умолчанию, вектора 0х00-0хF зарезервированы процом. Ты уже второй раз это пишешь. На самом деле зарезервированный диапазон - 0-0x1F. Поэтому тебе здесь и советовали установить "базу" на вектор 0x20 для мастера и соответственно 0x28 для слэйва.ZarathustrA писал(а): Даже если импрувить APIC по-максимуму (обработка ложных прерываний и ошибок APIC-протокола) то проблема все равно остается. Вот я и говорю, что нужно задействовать по минимуму. А если ты собрался реагировать на ложные прерывания, то хотябы обработчик не совмещай с обработчиками исключений.ZarathustrA писал(а): Я все больше склоняюсь к выводу, что корнем зла являяется ритуальная машина... упс. Виртуальная машина. Я пользуюсь боксом, варей и виртуал пк и при этом никаких проблем с ложными прерываниями не имею. Даже если они и происходят на этапе инициализации, они "съедаются" соответствующими обработчиками. Нужно сначала направить обработку прерываний на соотв. обработчики, а потом разрешать их обработку.ZarathustrA писал(а): Кстати вопрос: как можно на ходу отличать программные прерывания от аппаратных, кроме как просмотром маски ISR? А нафига? Аппаратные прерывания не должны конфликтовать с исключениями. У одного и того же аппаратного прерывания могут быть разные источники - для их определения ты должен опрашивать соотв. аппаратуру.SII писал(а): Кстати говоря, полагаться на "по умолчанию" нельзя ни в коем случае -- эти "умолчания" отнюдь не всегда соблюдаются даже в железе (ошибки разработчиков везде бывают), ну а виртуальные машины кривые все без исключения (правда, сделать нормальную ВМ для столь кривой архитектуры, как ИА-32 -- это действительно сверхсложная задача, а если добавить то, что нет совершенно полной, внятной и безошибочной спецификации даже на процессор -- то тем более). Поэтому надо _всегда_ проводить _полную_ инициализацию всего и вся, что используешь, не надеясь на то, что что-то там установлено заранее. Где-то в MP-спецификации было написано, что в начальном состоянии (перед передачей управления от BIOS) APIC должен находиться в режиме PIC/Virtual Wire. Разработчики BIOS могут использовать разные варианты (это зависит от аппаратной конфигурации и их собственных предпочтений), но результат должен быть вполне определенный. Другое дело, что APIC нужно по-любому программировать, чтобы даже в одноядерной системе иметь больший диапазон номеров прерываний.
|
Автор: | SII [ 29 апр 2010, 20:10 ] |
Заголовок сообщения: | Re: поток double fault exceptions |
phantom-84 писал(а): ZarathustrA писал(а): Вторая фишка в том, что по-умолчанию, вектора 0х00-0хF зарезервированы процом. Ты уже второй раз это пишешь. На самом деле зарезервированный диапазон - 0-0x1F. Поэтому тебе здесь и советовали установить "базу" на вектор 0x20 для мастера и соответственно 0x28 для слэйва.Кстати говоря, "зарезервированность" означает лишь то, что Интел объявила: первые 32 вектора предназначены для исключений, вырабатываемых самим процессором, поэтому использовать их для других целей не следует. Сие было благополучно проигнорировано ИБМ ещё при создании ИБМ ПЦ, поэтому одни и те же векторы используются и для исключений процессора, и для внешних прерываний, и для программных прерываний, вызывающих функции БИОС. phantom-84 писал(а): ZarathustrA писал(а): Я все больше склоняюсь к выводу, что корнем зла являяется ритуальная машина... упс. Виртуальная машина. Я пользуюсь боксом, варей и виртуал пк и при этом никаких проблем с ложными прерываниями не имею. Даже если они и происходят на этапе инициализации, они "съедаются" соответствующими обработчиками. Нужно сначала направить обработку прерываний на соотв. обработчики, а потом разрешать их обработку.Винда работает на ВМ? Работает. Линух работает? Работает. Так что корень зла -- не в ВМ (хотя она действительно может создавать определённые проблемы), а в неверной инициализации чего-нибудь. ZarathustrA писал(а): Кстати вопрос: как можно на ходу отличать программные прерывания от аппаратных, кроме как просмотром маски ISR? А нафига? Аппаратные прерывания не должны конфликтовать с исключениями. У одного и того же аппаратного прерывания могут быть разные источники - для их определения ты должен опрашивать соотв. аппаратуру.[/quote]Если по-хорошему -- проц вообще не должен давать возможность даже теоретически совмещать одни и те же векторы для разных целей. Увы, в Интел думать не умеют (в смысле умеют, но только те, кто реализует архитектуру в железе, а не те, кто разрабатывает саму архитектуру)... Так что единственное, что остаётся делать программистам -- это выносить векторы внешних прерываний за пределы младших 32, а прерываний, разрешённых для прикладных программ -- за пределы младших 32 и векторов, выделенных под внешние прерывания, и все остальные векторы блокировать от прикладных программ правильной настройкой дескрипторов (чтобы программы не могли выполнить соответствующий ИНТ). phantom-84 писал(а): SII писал(а): Кстати говоря, полагаться на "по умолчанию" нельзя ни в коем случае -- эти "умолчания" отнюдь не всегда соблюдаются даже в железе (ошибки разработчиков везде бывают), ну а виртуальные машины кривые все без исключения (правда, сделать нормальную ВМ для столь кривой архитектуры, как ИА-32 -- это действительно сверхсложная задача, а если добавить то, что нет совершенно полной, внятной и безошибочной спецификации даже на процессор -- то тем более). Поэтому надо _всегда_ проводить _полную_ инициализацию всего и вся, что используешь, не надеясь на то, что что-то там установлено заранее. Где-то в MP-спецификации было написано, что в начальном состоянии (перед передачей управления от BIOS) APIC должен находиться в режиме PIC/Virtual Wire. Разработчики BIOS могут использовать разные варианты (это зависит от аппаратной конфигурации и их собственных предпочтений), но результат должен быть вполне определенный. Другое дело, что APIC нужно по-любому программировать, чтобы даже в одноядерной системе иметь больший диапазон номеров прерываний.Да в спецификациях много что пишут, но время от времени что-нибудь где-нибудь неверно да реализуется. "Хочешь, чтобы что-то было сделано хорошо, -- сделай это сам" :) |
Автор: | KIV [ 29 апр 2010, 20:15 ] |
Заголовок сообщения: | Re: поток double fault exceptions |
Кстати, для заглушки на прерывания нужно не простой iret, а вот такой код: Код: mov al, 0x20 out 0x20, al ; out 0xA0, al для прерываний IRQ8-IRQ15 Чтобы контроллер прерываний понял, что обработки прерывания завершена. Иначе все прерывания с номером больше или равным текущему перестанут поступать. |
Автор: | SII [ 29 апр 2010, 21:02 ] |
Заголовок сообщения: | Re: поток double fault exceptions |
Это если используется обычный ПИК, а не АПИК. |
Автор: | Himik [ 02 май 2010, 11:44 ] |
Заголовок сообщения: | Re: поток double fault exceptions |
ZarathustrA писал(а): Еще раз подробно описываю ситуацию. При переключении на задачу у которой в TSS в флагах разрешены прерывания из задачи, в которой эти прерывания запрещены происходит double fault exception. При этом создается впечатление, что на самом деле это не исключение. а прерывание т.к.: 1) На стеке нет кадра первого исключения (как мы понимаем, double fault это всегда второе исключение) 2) Процессором на стек не ложится error code, хотя по мануалу он должен там быть сегда и быть нулевым. 1) На стеке не всегда есть кадр первого исключения, например при ошибке записи в стек. Но в любом случае, обработчик двойного исключения переключает указатель стека на свой - из своего TSS, поэтому кадра первого исключения здесь не будет никогда. 2) Значит это не двойное исключение, а скорей всего прерывание. После него ничего не происходит, потому что в обработчике не выполняется EOI, как я писал в прошлый раз. Думаю, проблема локализована. |
Автор: | ZarathustrA [ 02 май 2010, 19:25 ] |
Заголовок сообщения: | Re: поток double fault exceptions |
Так если так, то пусть висит. Х.. ему, а не EOI. Заодно и всех своих сородичей в диапазоне 0х00-0х0F заблокирует. |
Автор: | Himik [ 03 май 2010, 11:39 ] |
Заголовок сообщения: | Re: поток double fault exceptions |
Скорей всего это прерывание IRQ 0 от PIC 8259, оно по умолчанию настроено на Int 8. Поэтому IRQ 1...F останутся незаблокированными. По идее, при нажатии на клавишу клавиатуры возникнет IRQ 1 на Int 9. Попробуй вывести отладочную печать с Int 9 при срабатывании. |
Страница 3 из 5 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |