Alter.Org.UA  
 << Back Home EN en   Donate Donate 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-2017