Как правильно распознать прерывание ATA / IDE? - PullRequest
4 голосов
/ 20 сентября 2011

В настоящее время я работаю над хобби ОС, в частности драйвером ATA. У меня есть некоторые проблемы с командами ввода данных PIO с прерываниями. Я пытаюсь выполнить команду READ MULTIPLE, чтобы прочитать несколько секторов с диска, блок за блоком, с прерыванием для каждого блока.

Если я запрашиваю чтение 4 блоков (1 сектор на блок). Я ожидаю получить 4 прерывания, по одному для каждого блока данных. После получения 4-го прерывания я могу определить, что я перенес все данные, и соответствующим образом обновить структуру запроса. Однако в VirtualBox я обнаружил, что после передачи последнего блока данных я получил еще одно прерывание (STATUS = 0x50, READY, OVERLAPPED MODE SERVER REQ). Я могу просто прочитать регистр STATUS, чтобы очистить его, но я не думаю, что когда-либо получу 5-е прерывание в соответствии со спецификациями.

Итак, как правильно распознавать прерывание, выданное устройством ATA?

В этом примере я запускаю команду READ MULTIPLE, а затем мой ISR выполняет следующие действия:

  1. отключает прерывания процессора, устанавливает nIEN
  2. Считать один блок данных (не сектор!) Из регистра DATA,
  3. Если все данные прочитаны, прочитайте регистр STATUS, чтобы очистить «дополнительное» прерывание
  4. Выйти, очистив nIEN и отправив EOI как на главный, так и на подчиненный PIC

Спецификации ATA для протокола команд ввода данных PIO не указывают на то, что необходимо для чтения регистра состояния. Исходя из этого, я предположил, что когда я получаю прерывание, все, что мне нужно сделать, это следовать протоколу и закончить, отправив EOI в PIC. Что касается настройки / очистки nIEN, то при работе с VirtualBox я обнаружил, что если я не сделаю этого, я не получу никаких прерываний после первого. Поэтому я установил nIEN при входе в ISR, затем очистил его, прежде чем уйти. Я думаю, что это не будет иметь никакого эффекта, но это должно быть связано с чтением / записью этого конкретного регистра.

1 Ответ

5 голосов
/ 20 сентября 2011

Это всегда случается со мной, я отправляю вопрос, с которым я боролся, только чтобы вскоре найти ответ.

Спецификация ATA-6, на которую я ссылался, имеет одну строку в разделе ввода данных PIO (9.5):

В этом состоянии хост должен прочитать регистр состояния устройства.

В ATA регистр состояния имеет побочный эффект: он очищает ожидающее прерывание. Я знал это, но я не правильно прочитал эту часть раньше. Там не упоминается, почему вы должны читать регистр, просто указывается, как указано выше.

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

Это одна из трудностей при низкоуровневом программировании, на ключевые детали, такие как необходимость чтения регистра состояния в ISR, часто не обращают внимания. Этот был оставлен как одна строка в описании протокола. Называй меня придирчивым, но я просто ожидал большего акцента на этом пункте.

...