Universal ATA driver for Windows NT4/2000/XP
Keywords: UniATA, PnP, port, miniport, hardware dependency

Alter.Org.UA
<< Back |  | Home |  | EN |  |  | www/www1/www2
| #### Идеология Port/Miniport Разработчики Windows NT очень любят Port/Miniport модель драйверов. _Port_ драйвер (почти) всегда загружен. Он занимается общением с ОС, реализует общую функциональность для драйверов определенного класса устройств (например работа с прерываниями, получение аппаратных ресурсов - портов ввода вывода, диапазонов памяти, и т.п., занимается регистрацией устройства в системе, и т.д.). С другой стороны, _Port_ драйвер экспортирует удобное (не всегда :) API для _MiniPort_ драйвера (см. ниже). _MiniPort_ драйвер может загружаться автоматически или при помощи PnP-manager'а. _MiniPort_ содержит код поиска и инициализации устройств, а также обрабатывает набор стандартных для данного класса устройств запросов, передаваемых _Port_ драйвером. Например если scsiminiport (atapi, uniata) проинформировал scsiport о найденых устройствах и их параметрах, то scsiport создаст необходимые device object'ы, настроит обработчик прерываний и сообщит операционной системе о найденом оборудовании. #### UniATA Первая версия использовала scsiport.sys для регистрации в системе найденых устройств и требуемых ими ресурсов. Всю грязную работу (создание device object'ов, инициализация обработчика прерываний, управление очередью запросов и т.п. делал scsiport.sys. Позже, когда возникла необходимлсть борьбы с ограничениями scsiport'а (невозможность поиска неизвестных, но IDE-совместимых PCI устройств, проблемы с PIO/DMA на одном канале, пересортировка очереди, параллельное функционирование IDE каналов на контроллерах с 1 прерыванием) пришлось использовать Kernel API вместо scsiport API. На текущий момент основная проблема - PnP млдель драйверов в w2k/XP. Изначально UniATA разрабатывался для того, чтобы работать на _любом_ IDE-совместимом контроллере на _любом_ компьютере без переустановки драйверов. При установке драйвера устройства PnP manager запоминает для кагого оборудования этот драйвер предназначается. При последующих загрузках операционки PnP manager строит список оборудования и смотрит в registry, какой драйвер следует загрузить. Если попытаться подключить HDD к другой плате (с другим контроллером), PnP manager не сможет найти подходящего драйвера - вот и приехали. Другое дело - устройства, о существовании которых нужно просто знать (non pnp-enumerated). Драйвер такого устройства будет загружен в любом случае. Если такой драйвер просканирует PCI шину на предмет IDE контроллеров и сообщит о найденых ScsiPort'у, PnP manager решит, что в системе есть не pnp-совместимые устройства и заблокирует Sleep/Hibernate вместе с IDE hot-swap. Все эти грабли произростают из архитектуры scsiport'а. В резельтате обсуждения с Виталием мы пришли к следующему выводу: Для w2k/XP UniATA требуется собственный аналог scsiport, который будет всегда показывать операционке либо 1 (виртуальный) контроллер с кучей шин, либо набор виртуальных (и железо-независимых) контроллеров. Поиск совместимых устройств бедут производиться в тайне от ОС (и главное - PnP manager'а). Таким образом мы получим логический(ие) контроллер(ы) с неизменной нумерацией как это было в NT4. (Мне кажется, что это была гораздо более надежная и правильная архитектура) Еще потребуется драйвер-заглушка, который будет устанавливаться для каждого найденого устройства. Сам этот драйвер не будет ничего делать, PnP manager будет счастлив, а всей работой с устройством по-прежнему будет заниматься основной драйвер вируального контроллера. |
<< Back |  | Автор: Alter (Александр А. Телятников) |  | Сервер: Apache+PHP под FBSD |  | © 2002–2005