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

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

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

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

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

  1. отключает прерывания процессора, устанавливает nIEN
  2. Читает один блок данных (не сектор! ) в регистре DATA,
  3. Если все данные были прочитаны, прочтите регистр STATUS, чтобы очистить "дополнительное" прерывание
  4. Выход, очистив nIEN, и отправив EOI как ведущему, так и ведомому PIC

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

5
задан Mr. Shickadance 20 September 2011 в 14:59
поделиться