OSDev

для всех
Текущее время: 29 апр 2024, 09:39

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 47 ]  На страницу Пред.  1, 2, 3, 4, 5  След.
Автор Сообщение
 Заголовок сообщения: Re: поток double fault exceptions
СообщениеДобавлено: 29 апр 2010, 10:27 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1418
chizh писал(а):
А в обработчике прерываний делается команда EOF? Если нет, то поэтому и не приходит больше прерываний, и не возникает больше ошибок.
Ещё должны быть замаскированы прерывания контролдлера 8059A.


8259 ;) Но, по большому счёту, всё опять-таки сводится к полной явной инициализации всего железа без расчёта на то, что что-то как-то сделано автоматически или ещё кем-нибудь.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: поток double fault exceptions
СообщениеДобавлено: 29 апр 2010, 13:19 

Зарегистрирован: 18 апр 2010, 15:59
Сообщения: 155
Конкретно для данного исключения прерывания eoi не делается.

Кстати вопрос: как можно на ходу отличать программные прерывания от аппаратных, кроме как просмотром маски ISR?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: поток double fault exceptions
СообщениеДобавлено: 29 апр 2010, 14:08 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1418
Никак. Один из ляпов всех интеловских архитектур, начиная с 8008.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: поток double fault exceptions
СообщениеДобавлено: 29 апр 2010, 15:43 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
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 нужно по-любому программировать, чтобы даже в одноядерной системе иметь больший диапазон номеров прерываний.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: поток double fault exceptions
СообщениеДобавлено: 29 апр 2010, 20:10 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1418
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 нужно по-любому программировать, чтобы даже в одноядерной системе иметь больший диапазон номеров прерываний.


Да в спецификациях много что пишут, но время от времени что-нибудь где-нибудь неверно да реализуется. "Хочешь, чтобы что-то было сделано хорошо, -- сделай это сам" :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: поток double fault exceptions
СообщениеДобавлено: 29 апр 2010, 20:15 

Зарегистрирован: 16 фев 2010, 22:03
Сообщения: 101
Кстати, для заглушки на прерывания нужно не простой iret, а вот такой код:
Код:
mov al, 0x20
out 0x20, al ; out 0xA0, al для прерываний IRQ8-IRQ15

Чтобы контроллер прерываний понял, что обработки прерывания завершена. Иначе все прерывания с номером больше или равным текущему перестанут поступать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: поток double fault exceptions
СообщениеДобавлено: 29 апр 2010, 21:02 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1418
Это если используется обычный ПИК, а не АПИК.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: поток double fault exceptions
СообщениеДобавлено: 02 май 2010, 11:44 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
ZarathustrA писал(а):
Еще раз подробно описываю ситуацию.
При переключении на задачу у которой в TSS в флагах разрешены прерывания из задачи, в которой эти прерывания запрещены происходит double fault exception. При этом создается впечатление, что на самом деле это не исключение. а прерывание т.к.:
1) На стеке нет кадра первого исключения (как мы понимаем, double fault это всегда второе исключение)
2) Процессором на стек не ложится error code, хотя по мануалу он должен там быть сегда и быть нулевым.

1) На стеке не всегда есть кадр первого исключения, например при ошибке записи в стек. Но в любом случае, обработчик двойного исключения переключает указатель стека на свой - из своего TSS, поэтому кадра первого исключения здесь не будет никогда.
2) Значит это не двойное исключение, а скорей всего прерывание. После него ничего не происходит, потому что в обработчике не выполняется EOI, как я писал в прошлый раз. Думаю, проблема локализована.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: поток double fault exceptions
СообщениеДобавлено: 02 май 2010, 19:25 

Зарегистрирован: 18 апр 2010, 15:59
Сообщения: 155
Так если так, то пусть висит. Х.. ему, а не EOI. Заодно и всех своих сородичей в диапазоне 0х00-0х0F заблокирует.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: поток double fault exceptions
СообщениеДобавлено: 03 май 2010, 11:39 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
Скорей всего это прерывание IRQ 0 от PIC 8259, оно по умолчанию настроено на Int 8. Поэтому IRQ 1...F останутся незаблокированными. По идее, при нажатии на клавишу клавиатуры возникнет IRQ 1 на Int 9. Попробуй вывести отладочную печать с Int 9 при срабатывании.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 47 ]  На страницу Пред.  1, 2, 3, 4, 5  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 15


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB