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 нужно по-любому программировать, чтобы даже в одноядерной системе иметь больший диапазон номеров прерываний.