Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Путаница с прерываниями  (Прочитано 7069 раз)
0 Пользователей и 1 Гость смотрят эту тему.
MasterMan342
Участник

ru
Offline Offline
Пол: Мужской

« : 09-04-2014 18:43 » new

Доброго всем времени суток!
Разбираюсь с таблицей векторов прерываний, и попал в тупиковую ситуацию...

В общем, как известно, IT располагается в самом начале адресного пространства, и в
реальном, и в защищенном режимах. На сколько я знаю, прерывания 10h и 13h - Это прерывания сервисов
дисковой и графической системы BIOS.

Как я понимаю, в этой-же таблице располагаются и вектора обработчиков ошибок, так-ведь?
ну там, прерывание 0h, вызываемое при делении на ноль, NMI...

если это так, то я не понимаю, почему вот эти вектора:
0x003C     | 0x0F      | Reserved
0x0040     | 0x10      | x87 FPU error
0x0044     | 0x11      | Alignment check
0x0048     | 0x12      | Machine check
0x004C     | 0x13      | SIMD Floating-Point Exception

занимают места векторов BIOS? или же они располагаются в каких-то абсолютно разных
векторных таблицах? или они какие-то "контекстно зависимые"?

вопрос №2:
как обрабатываются IRQ и где хранятся их обработчики?
я где-то читал, что IRQ1-7 располагаются в таблице векторов прерываний, с 08h по 0Fh векторах и
IRQ8 - 15 в 70h - 77h.

Опять возникают непонятки х)
если это так, то почему они опять перекрывают вектора сервисов BIOS Меня одолевают смутные сомнения  Да что ты говоришь?..?

Объясните мне кто-нибудь, как оно есть на самом деле!))))
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 09-04-2014 19:50 » 

Цитата: MasterMan342
если это так, то я не понимаю, почему вот эти вектора:
0x003C     | 0x0F      | Reserved
0x0040     | 0x10      | x87 FPU error
0x0044     | 0x11      | Alignment check
0x0048     | 0x12      | Machine check
0x004C     | 0x13      | SIMD Floating-Point Exception

занимают места векторов BIOS? или же они располагаются в каких-то абсолютно разных
векторных таблицах? или они какие-то "контекстно зависимые"?
Начнём с того, откуда ты взял эту таблицу, и что она означает в твоём понимании?

В защищённом режиме каждый изолированный процесс (читай, операционная система) сам себе определяет таблицу прерываний - лишь бы в неё отражались аппаратные прерывания. Там уже никакого BIOS быть не обязано, и номера у сервисов могут быть в общем-то произвольными.

Цитата: MasterMan342
как обрабатываются IRQ и где хранятся их обработчики?
я где-то читал, что IRQ1-7 располагаются в таблице векторов прерываний, с 08h по 0Fh векторах и
IRQ8 - 15 в 70h - 77h.
Да, так. С 8 начинается, потому что 0-7 - это как раз обработчики ошибок.

Что значит как обрабатываются? Происходит аппаратное прерывание, которое генерирует соответствующий контроллер - вызывается код по указателю, хранящемуся в позиции таблицы прерываний. Пока этот код работает, аппаратные прерывания с таким же или более низким приоритетом маскируются (т.е. не могут прервать работу процессора) - это чтобы не накапливались каскады незавершённых обработчиков. Прервать обработчик прерывания может только прерывание более высокого приоритета.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
MasterMan342
Участник

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 10-04-2014 02:34 » 

Цитата: MasterMan342
если это так, то я не понимаю, почему вот эти вектора:
0x003C     | 0x0F      | Reserved
0x0040     | 0x10      | x87 FPU error
0x0044     | 0x11      | Alignment check
0x0048     | 0x12      | Machine check
0x004C     | 0x13      | SIMD Floating-Point Exception

занимают места векторов BIOS? или же они располагаются в каких-то абсолютно разных
векторных таблицах? или они какие-то "контекстно зависимые"?
Начнём с того, откуда ты взял эту таблицу, и что она означает в твоём понимании?

Это таблица обработчиков аппаратных исключений. взял я ее с сайта http://wiki.osdev.org/Interrupt_Vector_Table
и видел на множестве других сайтов, а так-же в официальной документации.
Да, так. С 8 начинается, потому что 0-7 - это как раз обработчики ошибок.
ну предположим, что так...
По официальной доке, вектора с 1 по 6 типа общие, 8, 9 и 13 только в реальном режиме, и все с 8 по 13 в защищенном.
опять вижу что некоторый диапазон обработчиков ошибок попадает под вектора IRQ. что это за фигня х) ?
в каком режиме реально досnупны обработчики IRQ?


В защищённом режиме каждый изолированный процесс (читай, операционная система) сам себе определяет таблицу прерываний - лишь бы в неё отражались аппаратные прерывания. Там уже никакого BIOS быть не обязано, и номера у сервисов могут быть в общем-то произвольными.

То есть хочешь сказать, что все (или большинство) прерываний BIOS в защищенном режиме не действуют что-ли?
при переходе в защищенный режим таблица векторов прерываний переписываются?

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

Это как? LDT имеешь в виду?



« Последнее редактирование: 10-04-2014 02:54 от MasterMan342 » Записан
darkelf
Молодой специалист

ua
Offline Offline

« Ответ #3 : 10-04-2014 06:11 » 

В реальном режиме таблица векторов прерываний (IVT) размещается по адресу 0 и содержит 256 указателей (по 4 байта каждый) на обработчики прерываний.
В защищенном режиме всё сложнее - это уже таблица дескрипторов прерываний (IDT) которая может располагаться где угодно - её положение загружается командой LIDT, размер её, в общем, тоже может варьироваться, и тоже указывается при описании таблицы. Каждый элемент таблицы имеет размер в 8-мь байт с довольно сложной структурой.
Далее и в реальном режиме и в защищенном - смысл прерываний один и тот-же, просто в реальном режиме некоторые прерывания, точнее исключения, просто не могут возникнуть.
Обычно в защищенном режиме ОС перехватывает все прерывания на себя и соответственно код обработчиков помещаемый в BIOS в процессе работы ОС не вызывается.
« Последнее редактирование: 10-04-2014 06:17 от darkelf » Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 10-04-2014 07:53 » 

Цитата: MasterMan342
Это таблица обработчиков аппаратных исключений
Как ты её понимаешь? Что это за циферки?

Цитата: MasterMan342
По официальной доке, вектора с 1 по 6 типа общие, 8, 9 и 13 только в реальном режиме, и все с 8 по 13 в защищенном.
опять вижу что некоторый диапазон обработчиков ошибок попадает под вектора IRQ. что это за фигня х) ?
в каком режиме реально досnупны обработчики IRQ?
В защищённом режиме прерывания 0h-Fh, а по твоей ссылке ещё и 10-13h отведены под обработки ошибок. Они зарезервированы процессором.

Обработчики аппаратных прерываний назначаются на любой диапазон - для этого просто настраивается контроллер прерываний. По умолчанию в реальном режиме они назначены на 8h-Fh и 70h-77h. В защищённом режиме ты должен их назначить сам ручками. Все остальные прерывания сервисные и могут быть какими угодно. При возврате из защищённого в реальный режим ты обязан восстановить аппаратные прерывания как было: 8h-Fh и 70h-77h.

(Номер IRQ является приоритетом прерывания, чем больше номер, тем ниже приоритет, тем в более последнюю очередь обрабатывается прерывание. См. выше про маскирование. Прерывание 2 немаскируемое - у него высший приоритет, выше любого аппаратного, его нельзя отключить.)

Цитата: MasterMan342
при переходе в защищенный режим таблица векторов прерываний переписываются?
Ты задаёшь и настраиваешь её сам. Зачем операционной системе BIOS? У неё собственные драйвера всех устройств.
« Последнее редактирование: 10-04-2014 08:01 от Dimka » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines