В настоящее время я работаю над хобби ОС, в частности драйвером ATA. У меня есть некоторые проблемы с командами ввода данных PIO с прерываниями. Я пытаюсь выполнить команду READ MULTIPLE, чтобы прочитать несколько секторов с диска, блок за блоком, с прерыванием для каждого блока.
Если я запрашиваю чтение 4 блоков (1 сектор на блок). Я ожидаю получить 4 прерывания, по одному для каждого блока данных. После получения 4-го прерывания я могу определить, что я перенес все данные, и соответствующим образом обновить структуру запроса. Однако в VirtualBox я обнаружил, что после передачи последнего блока данных я получил еще одно прерывание (STATUS = 0x50, READY, OVERLAPPED MODE SERVER REQ). Я могу просто прочитать регистр STATUS, чтобы очистить его, но я не думаю, что когда-либо получу 5-е прерывание в соответствии со спецификациями.
Итак, как правильно распознавать прерывание, выданное устройством ATA?
В этом примере я запускаю команду READ MULTIPLE, а затем мой ISR выполняет следующие действия:
- отключает прерывания процессора, устанавливает nIEN
- Считать один блок данных (не сектор!) Из регистра DATA,
- Если все данные прочитаны, прочитайте регистр STATUS, чтобы очистить «дополнительное» прерывание
- Выйти, очистив nIEN и отправив EOI как на главный, так и на подчиненный PIC
Спецификации ATA для протокола команд ввода данных PIO не указывают на то, что необходимо для чтения регистра состояния. Исходя из этого, я предположил, что когда я получаю прерывание, все, что мне нужно сделать, это следовать протоколу и закончить, отправив EOI в PIC. Что касается настройки / очистки nIEN, то при работе с VirtualBox я обнаружил, что если я не сделаю этого, я не получу никаких прерываний после первого. Поэтому я установил nIEN при входе в ISR, затем очистил его, прежде чем уйти. Я думаю, что это не будет иметь никакого эффекта, но это должно быть связано с чтением / записью этого конкретного регистра.