Как определить прерывания, специфичные для устройства на x86? - PullRequest
4 голосов
/ 21 апреля 2009

В руководстве разработчика программного обеспечения Intel говорится, что векторы прерываний 32-255 обычно определяются пользователем для внешних устройств ввода-вывода. В моем классе системного программирования я должен разработать простой драйвер устройства. У меня вопрос, как я могу определить конкретный вектор прерывания, который будет использоваться для конкретного устройства? Это сделано с BIOS?

Примечание: мы разрабатываем простую операционную систему, поэтому моя ситуация довольно специфична, однако в конце мне нужно понять, как все это происходит в системе x86. В настоящее время наша система настроена таким образом, что несколько векторов прерываний выше 32 назначаются таким устройствам, как последовательный порт и клавиатура. При чтении таблицы данных для контроллера ввода-вывода Intel 82801EB ICH5, в частности в разделе, касающемся 8259 PIC, говорится, что IRQ15 является вторичным каналом IDE. Как это в конечном итоге будет помещено в стек как вектор прерывания?

Я могу быть настолько смущен, что этот вопрос не имеет смысла, поэтому я заранее извиняюсь.

РЕДАКТИРОВАТЬ: Таким образом, наш класс системного программирования имеет очень простую ОС, которая имеет подпрограммы ядра для установки ISR для обработки определенных прерываний с учетом номера вектора. В нашем классе в прошлом квартале профессор дал нам файл заголовка, который определял клавиатуру как векторное число 0x2c или что-то подобное. Я пытаюсь выяснить, как сопоставить прерывания основного и / или вторичного канала IDE с различными ISR, используя наши процедуры ядра. На данный момент все неиспользуемые векторы прерываний имеют обработчик по умолчанию, который будет печатать сообщения в случае возникновения прерывания, поэтому прерывания IDE на данный момент даже не включены, однако это другой вопрос.

Ответы [ 6 ]

1 голос
/ 21 апреля 2009

Устройство может получить прерывание двумя способами:

  1. Используйте механизм Plug and Play или Pci. Если вы это сделаете, BIOS позвонит на ваше периферийное устройство и запросит требования к ресурсам. После этого ваш драйвер может перечислять подключаемые устройства, искать поддерживаемое устройство и получать аппаратное прерывание от устройства.

  2. Как это было сделано в первые дни: просто используйте одно прерывание. Добавьте DIP-переключатель к устройству, которое позволяет пользователю выбирать между различными прерываниями. Распределение ресурсов теперь в руках пользователей. Пользователь также передаст номер прерывания водителю во время загрузки.

Теперь, как перехватить прерывание: это зависит от ОС и режима, в котором работает x86. Для «голой» системы вы можете запросить IDT (таблицу дескрипторов прерываний) с помощью специальной инструкции. Когда у вас есть IDT, вы можете получить адрес и вставить адрес обработчика IRQ в правильный слот. Для реального режима я не знаю, как это делается.

Если у вас есть хотя бы небольшая ОС реального времени или что-то похожее на ОС, вероятно, уже существует функция ядра, которая выполняет тяжелую работу за вас.

1 голос
/ 21 апреля 2009

Вы можете запрограммировать PIC (программируемый контроллер прерываний) для отображения определенных IRQ устройства.

На x86 есть два PIC с гирляндной цепочкой, дающие IRQ0-IRQ17. IRQ0-7 управляется 8259, а IRQ8-15 - вторым 8259. Первый сигнализирует ЦПУ и является ведущим, а второй (ведомый) сигнализирует первый.

IDT (таблица дескрипторов прерываний) отображает прерывания на адреса ISR (подпрограммы обработки прерываний). Прерывания могут быть вызваны напрямую с помощью команды INT (программные прерывания).

Например, чтобы вызвать прерывание 0x80, выполните INT 0x80.

Для обработки 0x80, mov [0x80*4], int_80_handler. Предполагая 32-битную архитектуру, адрес функции int_80_handler теперь сохраняется в 0x80-м месте в IDT.

Вы найдете это полезным:
http://en.wikipedia.org/wiki/Intel_8259
http://en.wikipedia.org/wiki/Interrupt_Handler
http://en.wikipedia.org/wiki/Interrupt
http://en.wikipedia.org/wiki/Interrupt_descriptor_table

1 голос
/ 21 апреля 2009

Прошло много времени с тех пор, как я справился с этим, так что это может быть отключено: я помню, что контроллер прерываний ПК имеет 15 линий IRQ. Они отображаются на конкретные смежные векторы прерываний x86. Поэтому, когда периферийное устройство запускает линию IRQ, PIC прерывает ЦП и сообщает, к какому вектору перейти, как если бы выполнялась соответствующая инструкция INT. Некоторые IRQ жестко закодированы для определенных периферийных устройств, но я полагаю, что устройства PCI согласовывают с операционной системой IRQ и некоторые другие ресурсы (как и устаревшие устройства ISA PnP).

Я не понимаю, что вы подразумеваете под «Как это в конечном итоге будет помещено в стек как вектор прерывания?»

0 голосов
/ 25 января 2010

INT 21h / AH = 25h - установить вектор прерывания; вход: AL = номер прерывания. DS: DX -> новый обработчик прерываний.

0 голосов
/ 21 апреля 2009

Что ж, похоже, я нашел ответ в нашем коде поддержки, в частности, в процедуре инициализации PIC. С помощью следующего кода строки IRQ отображаются со смещением 20h и 28h в IDT для главного и подчиненного PIC соответственно.

/* ICW2: master offset of 20 in the IDT, slave offset of 28 */</p> <pre><code>__outb( PIC_MASTER_IMR_PORT, 0x20 ); __outb( PIC_SLAVE_IMR_PORT, 0x28 );

Это означает, что клавиатура была сопоставлена ​​с вектором с номером 2c, а первичный и вторичный каналы будут сопоставлены с 2e и 2f соответственно. Некоторые из вас, вероятно, могли бы дать мне лучшие ответы, если бы я задал вопрос лучше, но я все равно ценю помощь!

Таблица 45 таблицы 82801EB ICH5 подробно описывает линии IRQ 8259, и в моей ОС ведущий просто загружается со смещением 20h, а ведомый - 28h.

Спасибо!

0 голосов
/ 21 апреля 2009

Как я помню, в начале области памяти есть таблица векторов, которая указывает на процедуру, вызываемую при возникновении определенного прерывания. Может быть, я достигаю слишком низкого уровня (старый программист на сборке x86), но на базовом уровне вы устанавливаете вектор в этой таблице, а затем вызывается ваша подпрограмма. У меня нет с собой моего старого справочного материала, поэтому я не могу дать вам реальные звонки, но я был бы удивлен, если бы официальный метод работал вне BIOS.

В наши дни GUI я уверен, что есть и другие, более подходящие методы, которые позволяют делиться прерываниями и все такое хорошее.

РЕДАКТИРОВАТЬ: игнорировать многое из этого, я только что видел, что вы смотрите на прерывания 16 и выше, которые находятся за пределами аппаратных прерываний. Я отошел от этого уровня программирования до того, как в этом пространстве появилось какое-то интересное оборудование, поэтому я имел дело только с первыми 15 IRQ (16-й - каскад между контроллерами). Я оставляю это на всякий случай, если это кому-то еще интересно :) 1005 *

...