https://wasm.in/blogs/ata-dlja-dzenstvujuschix-chast-2-pci-dma.355/ всем привет! есть пара вопросов по публикации ATA для дZенствующих. Часть 2: PCI DMA буду рад любой помощи. пишу на Си. Задача: считать с одного диска (Канал 0 Master) и записать на другой диск (Канал 1 Master) блоками LBA. Подключение IOConnectInterrupt не сработало: !idt показало, что прерывание не Shared, пришлось сделать подмену KINTERRUPT (для IRQ14 и IRQ15 соответственно). Прерывания попадают в мои ISR и далее я их перенаправляю в DPC (контекст также попадает, с этим проблем нет). есть пару вопросов: 1. При считывании __asm sidt[Idt] получил Idt.Base=80B9, Idt.Limit=7FF. Но фактическое расположение таблицы прерываний оказалось по адресу 80B95400 (подсмотрел в WinDbg с помощью !idt). Откуда взялось это дополнительное смещение (Idt.Base << 16) + 0x5400)? 2. правильно ли я понимаю, что прерывание будет происходить только тогда, когда DMA закончит работу (при чтении с диска: когда данные будут в памяти; при записи на диск: когда данные буду на диске)? 3. как проверить правильность работы? у меня есть два диска по 2ГБ, копирую своим драйвером с одного на другой (периодически подсматриваю что копирую через windbg), складывается ощущение, что прерывание срабатывает раньше, чем данные появляются в физической памяти. есть еще вопросы, но думаю задавать их по-порядку.