Обсуждение статьи ATA для дZенствующих. Часть 2: PCI DMA

Тема в разделе "WASM.ARTICLES", создана пользователем coustou, 30 июл 2017.

  1. coustou

    coustou New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2017
    Сообщения:
    1
    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), складывается ощущение, что прерывание срабатывает раньше, чем данные появляются в физической памяти.
    есть еще вопросы, но думаю задавать их по-порядку.