Как правильно подтвердить прерывание ATA / IDE?

В настоящее время я работаю над операционной системой для хобби, в частности над драйвером 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, а затем сбрасываю его перед уходом. Я бы подумал, что это не повлияет, но это должно быть связано с чтением / записью этого конкретного регистра.


person Mr. Shickadance    schedule 20.09.2011    source источник


Ответы (1)


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

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

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

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

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

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

person Mr. Shickadance    schedule 20.09.2011