Автоматическое распознавание и конфигурирование
За каждым аппаратным устройством, подключенным к компьютеру, закрепляются системные ресурсы, которые могут включать:
Поскольку разные устройства были изготовлены в разное время разными поставщиками, то конфликты ресурсов совершенно неизбежны. Первые персональные компьютеры требовали немалой сообразительности от пользователя при конфигурировании подключаемых устройств, правильного, а подчас — единственно верного, выставления перемычек или DIP переключателей, определяющих уникальную настройку ресурсов для данной системы. Инсталляция нового устройства требовала знания, какие ресурсы уже выделены существующим устройствам. Ошибки в таком ручном конфигурировании были частыми, а результатом были либо невозможность загрузить систему, либо непредсказуемые зависания системы и неработающие устройства.
Для преодоления этих проблем были введены новые принципы построения шинных архитектур, которые бы поддерживали автоматическое распознавание и конфигурирования устройств. Автоматическое распознавание должно происходить в момент загрузки/перезагрузки системы или непосредственно в момент подключения устройства к компьютеру ("горячее" подключение). Возможности операционной системы, соответственно, должны быть таковы, чтобы соответствующее сопроводительное программное обеспечение вступало в работу без общей перезагрузки системы.
Автоматическое конфигурирование позволяет программному обеспечению устанавливать приемлемые значения ресурсов для устройств, допускающих программную настройку. Эти усовершенствования позволяют отойти от использования перемычек на подключаемых устройствах, а конечному пользователю более нет нужды знать обо всех особенностях конфигурирования системы и нового устройства в ней.
Спецификация PCI обязывает каждую отдельную функцию (функциональную единицу устройства, а значит, и шины) иметь свою собственную область для хранения конфигурационных данных, размер которой равен 256 байт. Эта область известна как конфигурационное пространство функциональных единиц PCI (PCI function's configuration space).
Первые 64 байта такого конфигурационного пространства (называемого заголовком) имеют предопределенную структуру (таблица 2.4), в то время как остальные 192 байта могут быть использованы по усмотрению разработчика данной PCI платы. Системное программное обеспечение может использовать этот заголовок для идентификации функциональной единицы PCI и выделения ей ресурсов. Заголовок включает:
Регистр Class Code внутренне разбит на три поля (Class Code, старший байт, Sub-Class Code и ProgIF, младший байт) и содержит информацию для использования классовыми системными драйверами (предназначенными для обслуживания целого класса родственных устройств, например, сетевых контроллеров, устройств мультимедиа, docking-станций, шинных мостов, кодирующих/декодирующих контроллеров, интеллектуальных контроллеров ввода/вывода). Например, значение Class Code, равное 0C (hex), в спецификации PCI 2.2 определяет контроллеры последовательных шин. Тогда значение Sub-Class Code, равное 00, определяет IEEE 1394, 01 — ACCESS.bus, 02 — SSA (Serial Storage Architecture), 03 — USB, 04 — Fibre Channel, 05 — SMBus (System Management Bus).
Спецификация шины 1394 была разработана с непосредственной поддержкой спецификации PnP. Каждое устройство при подключении к шине сигнализирует о своем существовании при выполнении шинной операции 'reset', что в сильной степени напоминает способ обращения с шиной USB и ее устройствами. Хост-компьютер (или другие узлы) выполняют операцию "перечисления" конфигурационных ПЗУ для того, чтобы обнаружить данное устройство и обеспечить запуск (а при необходимости — и инсталляцию) соответствующего драйвера.
Спецификация USB была разработана с непосредственной поддержкой спецификации PnP (иногда кажется, что — с откровенной ориентацией на WDM модель драйверов Windows). Каждое USB устройство при подключении к шине USB сигнализирует о своем существовании и сообщает идентификатор производителя (vendor ID) и идентификатор устройства (device ID). Эти идентификаторы являются определяющей информацией в выборе загружаемого драйвера — соответствующая информация должна присутствовать в Системном Реестре (если ничего подходящего там не обнаруживается, то инициируется процесс установки нового драйвера).
Стандарт шины PC Card удовлетворяет спецификации PnP полностью, хотя еще продолжается внесение изменений, касающихся "горячего подключения" устройств и автоматического конфигурирования.
Программное обеспечение для стандартов PC Card или CardBus разделяется на два крупных фрагмента: Сервисы Сокетов, Socket Services (в данном случае, socket — гнездо, разъем), и Службы Карт (Card Services). Первый представляет программное обеспечение уровня BIOS, и оно управляет в системе одним или более разъемов. Это программное обеспечение отвечает за обнаружение и объявление факта подключения нового устройства. Вторая часть (Card Service) управляет аппаратными ресурсами данной карты.
Для подкласса USB значение ProgIF, равное 00, описывает USB контроллер, соответствующий спецификации Universal host Controller. Значению 10 (hex) соответствует контроллер спецификации Open Host Controller, а значение FE (hex) описывает USB устройство (не являющееся хост-контроллером).
|
Таблица 5.4. Заголовок конфигурационного пространства одной функции устройства PCI |
Регистры Base Address Register 5..0 содержат адреса портов ввода/вывода (или диапазонов отведенной памяти) для доступа к внутренней памяти данной PCI функции.
Отображать все 256 адресов конфигурационного пространства в памяти или пространстве ввода/вывода достаточно расточительно, поэтому операционная система дает возможность доступа к конфигурационному пространству путем обращения к следующим двум регистрам (адреса которых устанавливаются операционной системой):
Операционная система предоставляет HAL функции для доступа к конфигурационным данным. Для этого предлагается использовать функции HalGetBusData, HalSetBusData и HalAssignSlotResources. Правда, в WDM модели они считаются устаревшими (даже их описание в DDK отсутствует) — рекомендовано работать через запросы к нижнему драйверу стека.
Для идентификации драйвера, загружаемого операционной системой для обслуживания данного устройства, спецификация PCI рекомендует разработчикам ОС использовать информацию из конфигурационных регистров Vendor ID, Device ID, Revision ID, Class Code, Subsystem Vendor ID, Subsystem ID (последние два стали обязательными только в спецификации версии 2.2).