что касательно DMA...
в свое время переписывал драйвер для ISA карточки L-Carda. там как раз использовались DMA каналы... в 95 винде. так вот насколько я тогда узнавал, штука это донельзя простая и представляет из себя банальный счетчик, который просто следить за автоматическим инкрементом читаемого или записываемого адреса в контроллере записи на ПК - его просто надо инициализировать. во ВСЕМ остальном - процедура аналогична чтения порта I/O, но поскольку реализация аппаратная - позволяет на ISA получить выигрышь по скоросте - сколько у меня тоглда получилось я честно говоря не помню, кажется до 200кГц - но вот чего?
). А родной драйвер LCarda на тех скоростях при оцифровке потока - терял отсчеты, отсюда и задача встала.
на PCI - насколько я понимаю то что называют DMA и сама виндовая функция DMAAdapter->DmaOperations->AllocateCommonBuffer
просто размещает заданный объем памяти по непрерывним ФИЗИЧЕСКИМ адресам, чтобы бусмастеру PCI было проще записывать в память ПК по инкременту. если бусмастер PCI платы умный - ему даже рваное(физически) адресное пространство подойдет, только таблицу физических адресов надо построить(ScatterGather так называемый).
аналог DMAAdapter->DmaOperations->AllocateCommonBuffer функции - размещение памяти по непрерывным физ адресам, в некешируемой области и получение физического его адреса на шине. Все это можно кстати и другими функциями винды реализовать. вышеуказанная функция, всего лишь, в одном вызове все это делает. ВСЕ остальное делает контроллер PCI на плате.
может ли мост конвертировать одиночные запросы в линейное чтение - не помню... в одном из внутренних регистров контроллера PCI платы лежит флаг Prefetchable - поинтерисуйтесь стоит он или нет? Софтайс его показывает по команде "pci"
(я не про альтеру, а про стандарт PCI)
типа такого: "Base addres 0: E4000000 64Mb Memory 32-bit Prefetchable"
ИМХО системный контроллер DMA - вам не поможет.
удачи!