Да, знаю, все это старье и никому не надо, но все-таки
1. Когда ISA-плата посылает DRQ, желая начать DMA или стать хозяином шины, 8237 приостанавливает процессор через HOLD, пока DRQ не будет снят. Так ли это на всех матерях, которые были с ISA, включая поздние Пентиумы? Интересует в основном PC, как там на серверах или еще где-то, где есть ISA, неважно, но если есть инфа - было бы неплохо.
2. Пишут, что возможности контроллера DMA были когда-то расширены и стали позволять назначать несколько "окон" памяти для одной передачи. Где про это можно почитать поподробнее? Было ли это стандартом, когда появилось, как реализовывалось, программировалось, использовалось ли и т. п.
intel.com - есть документация и референсные схемы.
P.S. 8237 с помощью вывода HOLD не может приостановить процессор - всего лишь спросить "не будет ли любезен многоуважаемый процессор освободить шину?" - не более.
Ага, первый вопрос тогда снимается. А вот по второму - если бы знать, что искать, давно бы уже нашел
Дык в документации можно найти описание управляющих регистров, описание режимов и т.д.
В чем проблема-то?
В документации на что?) Последний известный мне DMA контроллер - 8237A на 386. Потом, пишут, контроллер стали встраивать в чипсеты (естественно) и у него стало два режима - нативный и совместимый с 8237A. Вот этот вот нативный - что это и где?
Хм, логично, спасибо
Про самый новый контроллер DMA, посмотрите DMA Engine или Intel Quick Data в описании
процессоров Xeon под сокет 2011. Этот узел входит в состав процессора, в отличие от
контроллеров 8237, которые в составе моста PCH. Конечно, это уже не ISA.
Также
composter.com.ua/content/ssd-diski-novye-trebovaniya-k-platformam-2014-12-24
Несколько "окон" памяти для одной передачи поддерживается Bus-Master контроллерами,
входящими в состав контроллеров периферийных устройств, например IDE, SATA, USB.
Также, механизм трансляции адресов формируемых bus-master устройством входит в
состав технологии виртуализации VT-d (см. спецификацию VT-d).
Это надо для того, чтобы bus-master устройство могло работать с диапазоном памяти,
который является непрерывным в линейном адресном пространстве, но при этом
фрагментирован физически. Чтобы не ре-инициализировать адрес при переходе через
границы фрагментированных страниц. Но в "старом" контроллере 8237 таких функций
нет, его сейчас мало кто использует кроме FDD и LPT.
В принципе - просто спецификацию PCI можно почитать, IMHO. Нативный - это PCI. Где контроллер DMA - не в чипсете, а на плате.
А в чипсете - арбитр шины.
Википедия:
"В шинах MicroChannel, SBus, разработанной под их большим влиянием PCI и её концептуальных производных AGP и PCI-X, используется иная реализация DMA. Эти шины позволяют любому устройству заявить о возникновении потребности к захвату шины, таковая потребность удовлетворяется т. н. арбитром при первой возможности. Устройство, успешно осуществившее захват шины, самостоятельно выставляет на шину сигналы адреса и управления и исполняет в течение какого-то времени ту же ведущую роль на шине, что и ЦП. Доступ ЦП к шине при этом кратковременно блокируется"
Т.е. для DMA-трансфера я программирую не "имитацию 8237", а регистры своей платы, имеющей контроллер DMA. Грубо говоря - инициализирую регистр базового физического(!) адреса в ОЗУ компа (откуда или куда), регистр размера трансфера и ставлю в контрол-регистре битики направления и "ДАВАЙ DMA!".
Далее либо ловлю прерывание от платы по окончании трансфера (и анализирую бит готовности/окончания трансфера и бит ошибки типа ABORT), либо могу поразвлекаться поллингом бита готовности/окончания трансфера в контрол-регистре.
А заморочки с VT-d - это уже следующий шаг, для "продвинутых".
Вот, кстати.
habrahabr.ru/post/37455/
Т.е. я работаю по Contignous DMA (у меня всего 8 Кб максимальный трансфер и входящего/исходящего потока нет как такового),
а тот же USB-контроллер, как я понимаю - по Scatter/gather.
А кому счас легко...
Ох, сколько ответов, спасибо
Мне, в общем-то, новые шины не нужны совсем, ISA только интересует. С захватом шины своим девайсом все ясно, там что угодно можно делать Дело вот в чем - я собираюсь делать довольно простое устройство для компьютеров диапазона примерно Socket 7 - Socket 370, при этом уложиться в как можно меньшую стоимость, так что ISA - оптимальный вариант. Просто хотелось узнать, были ли какие-нибудь "стандарты" для ISA DMA контроллера после 8237. Если во всех чипсетах своя реализация, то нафиг-нафиг, писать кучу проверок в драйвере совсем не хочется.
Отправить комментарий