Введение

Взаимодействие программ с периферийными устройствами

Периферийные устройства могут подключаться к интерфейсам системного уровня (ISA, PCI, PCI-X, PCI-Express, AGP, LPC) или к периферийным интерфейсам (порты COM, LPT, Game; шины USB, FireWire, SCSI). Абстрагируясь от конкретной реализации подключения на системном уровне, можно говорить о логической системной шине PC-совместимого компьютера — интерфейсе со следующими базовыми свойствами: 

  • интерфейс обеспечивает транзакции обращения к пространствам памяти и ввода/вывода;
  • в транзакциях фигурируют физические адреса пространств памяти и ввода/вывода;
  • адресные пространства памяти и ввода/вывода являются «плоскими»: адрес выражается одним числом в диапазоне, определенном принятой разрядностью адресации. Любой адрес может принадлежать регистру (ячейке памяти) только одного устройства (или системной памяти, включающей ОЗУ и энергонезависимую память);
  • транзакции могут инициироваться как центральным процессором (процессорами), так и активными устройствами (мастерами шины);
  • все адресуемые элементы безусловно доступны центральному процессору; на адресуемость элементов со стороны мастеров шин могут накладываться специфические ограничения;
  • устройства, подключенные к системной шине, могут посылать процессору (процессорам) запросы аппаратных прерываний.

Взаимодействие программ с устройствами, подключенными к системной шине, возможно следующими способами:

  • через регистры устройств, отображенные на пространство памяти или пространство ввода/вывода;
  • через области адресов памяти, принадлежащей устройству (физически расположенной на контроллере или адаптере устройства);
  • через регистры конфигурационного пространства PCI (для устройств, подключенных к PCI, PCI-X, PCI-Express, AGP);
  • через области системного ОЗУ, доступные активным устройствам-мастерам шины (обмен с использованием DMA);
  • через аппаратные прерывания, сигнализируемые устройствами по доступным им линиям IRQx (ISA) или INTx# (PCI), а также по сообщениям MSI (PCI).

Обращения к регистрам конфигурационного пространства PCI (также «плоского») не относятся к базовым свойствам системной шины, поскольку программно они реализуются операциями обращения к пространству ввода/вывода и (или) памяти. С устройствами, подключенными к интерфейсам периферийного уровня, взаимодействие возможно только через их контроллеры (адаптеры), подключенные к системной шине. На системной шине «видны» и доступны только эти адаптеры и контроллеры. Способы взаимодействия с устройствами определяются интерфейсом контроллера. Особенности взаимодействия с устройствами шин USB и FireWire рассмотрены далее, интерфейсы хост-контроллеров этих шин рассмотрены в следующих темах.

Программное обеспечение компьютера состоит из ряда компонентов: прикладного ПО (исполняемые модули — .EXE-файлы), драйверов устройств, системных драйверов, динамически компонуемых модулей, BIOS. Эти компоненты имеют различные возможности взаимодействия с устройствами, состав используемых компонентов зависит от операционной системы и уровня разделяемости данного устройства. Между прикладным ПО и периферийными устройствами возможны следующие варианты отношений:

  • одиночное монопольное подключение: ПУ подключено к системной шине (возможно, через промежуточный периферийный интерфейс). С этим устройством в любой момент времени может взаимодействовать лишь одно приложение. Это самый простой вариант в плане организации взаимодействия ПО и устройства;
  • групповое монопольное подключение: группа конечных ПУ подключена через промежуточный интерфейс к одному контроллеру, подключенному к системной шине. С данными устройствами может в любой момент времени взаимодействовать только одно приложение. По сравнению с предыдущим вариантом, здесь появляется небольшое усложнение, связанное с выбором конкретного конечного устройства для текущей операции обмена. Промежуточный интерфейс должен обеспечивать адресацию, управляемую приложением;
  • одиночное разделяемое подключение: единственное конечное ПУ, подключенное к системной шине, может использоваться несколькими приложениями и/или процессами. Каждое из приложений (процессов) взаимодействует с устройством так, как будто оно — единственный «клиент» данного устройства. В структуре ПО, обеспечивающего взаимодействие с данным устройством, должны присутствовать средства виртуализации данного устройства. Эти средства и создают приложениям иллюзию монопольного взаимодействия с устройством. Пример — дисплей, подключенный к графическому адаптеру, с поддержкой оконного интерфейса. Здесь каждое приложение в отведенном ему логическом окне выполняет вывод изображения, не заботясь о текущем положении окна. Другой пример — клавиатура, обеспечивающая ввод символов в активное приложение;
  • множественное разделяемое подключение: множество конечных ПУ подключено через периферийный интерфейс к общему контроллеру, связанному с системной шиной. Возможно одновременное взаимодействие нескольких приложений (процессов) с различными конечными ПУ. Сложность заключается в разделяемости: все взаимодействия осуществляются через общий контроллер периферийного интерфейса. Дополнительно возможно и коллективное использование конечных ПУ, для чего требуется виртуализация этих устройств. Примеры подключения: шины SCSI, USB, FireWire.

Вполне очевидно, что с точки зрения логических связей прикладное ПО может взаимодействовать с устройством непосредственно лишь в монопольном варианте использования. Все остальные варианты требуют выделения специальных модулей — драйверов, решающих задачи организации разделяемого использования контроллера и/или виртуализации устройства. Однако и для монопольного варианта отделение драйвера от прикладного ПО полезно с точки зрения модульности: при должной организации интерфейса между драйвером и прикладным ПО переход на использование новой модели устройства и/или на иной интерфейс его подключения потребует только смены драйвера, но не переработки прикладного ПО.

Взаимодействие программ, выполняемых центральным процессором (хост-программ), с периферийными устройствами возможно тремя основными способами:

  • программно-управляемый обмен;
  • прямой доступ к памяти;
  • прерывания.

Программно-управляемый обмен — PIO (Programmed Input-Output). В исполняемой программе (или драйверах, которыми она пользуется) присутствуют инструкции ввода/вывода для портов устройства или инструкции обращений к областям памяти, находящейся в устройстве. Реальное физическое взаимодействие с устройством (и вызываемые этим изменения состояния устройств) происходит в момент выполнения этих инструкций. Такая жесткая синхронизация программы и устройства из рассматриваемых шин имеется в PCI/PCI-X, когда устройство является ведомым (target). Из интерфейсов, не рассмотренных в данной книге, такой способ обмена используется в LPT и COM портах (в режимах без FIFO и DMA), а также в шине ATA (при доступе к регистрам устройства и обмене данными в режиме PIO). Данный способ взаимодействия позволяет предельно упростить интерфейсную часть периферийного устройства. Расплатой за это упрощение является нагрузка на центральный процессор. Отметим, что применительно к шине PCI (и всем ее «родственникам») программно-управляемый обмен не позволяет приблизиться к декларированной высокой пропускной способности шины. Причиной тому является неспособность процессора породить длинные пакетные транзакции на шине PCI (см. главу 2), поэтому следует избегать данного способа взаимодействия при интенсивном обмене данными;

Прямой доступ к памяти — DMA (Direct Memory Access). Обмен между системной памятью (ОЗУ) и устройством выполняется без непосредственного участия процессора. Обмен осуществляет контроллер прямого доступа, для устройств шины PCI (и всех ее «родственников») контроллер является частью устройства — мастера шины (Bus Master). Штатного централизованного контроллера DMA, как это было в архитектуре ISA, для шины PCI нет. В зависимости от того, кто является инициатором обмена, различают два варианта прямого доступа:

  • DMA по инициативе хоста (Host Initiated DMA). Задание на пересылку каждого блока формирует программа, исполняемая на ЦП; она же сообщает контроллеру DMA параметры сеанса (начальный адрес, длину блока и направление передачи) записью в его регистры. Физические операции обмена синхронизируются с устройством — оно своими внутренними сигналами запускает обмен и, если требуется, управляет потоком (вводит сигнал готовности). Этот вариант требует довольно простых аппаратных средств устройства, расплата за упрощение — необходимость привлечения ЦП к организации каждого сеанса (обычно по прерываниям). Это не очень эффективно при передаче больших объемов данных, которые могут располагаться в разных не смежных страницах физической памяти;
  • DMA по инициативе устройства (Target Initiated DMA). Здесь хост-программа формирует в памяти программу ввода/вывода для устройства, обычно представляющую собой связанный список дескрипторов передач, и указывает устройству на начало списка. Контроллер устройства считывает эти дескрипторы из ОЗУ и по ним организует сеансы передачи данных между устройством и буферами в ОЗУ, описанными дескрипторами передач. Формирование программы может быть статическим или динамическим. В первом случае хост-программа передает устройству указатель на готовый список дескрипторов и не имеет права его модифицировать до тех пор, пока устройство не отработает список до конца. Так, например, работает PCI-контроллер шины ATA. При динамическом формировании хост может добавлять новые дескрипторы (в конец списка), постоянно «подбрасывая» контроллеру новые задания. Так работают контроллеры шины USB и FireWire, PCI-контроллеры локальных сетей и ряд других. Работа устройства по программе требует усложнения его контроллера, но эти затраты окупаются повышением производительности и эффективности ввода/вывода. При этом стараются минимизировать число прерываний центрального процессора, инициируемых устройством.

Прерывания (Interrupts) — сигнализация от устройства (его контроллера) центральному процессору (процессорам в мультипроцессорных системах) о некоторых событиях, требующих программных действий хоста. Эти события асинхронны по отношению к программному коду, исполняемому процессором. Прерывания требуют приостановки выполнения текущего потока инструкций (с сохранением состояния) и запуска исполнения процедуры-обработчика прерывания ISR (Interrupt Service Routine). Эта процедура первым делом должна идентифицировать источник прерывания (а их может быть и несколько), затем выполнить действия, связанные с реакцией на событие. Если события должны вызывать некоторые действия прикладной программы, то обработчику прерывания следует только подать сигнал (через ОС), запускающий (или пробуждающий) поток инструкций, выполняющий эти действия. Собственно процедура ISR должна быть оптимизирована по затраченному времени. Обслуживание прерываний, особенно в защищенном режиме, в PC-совместимых компьютерах на процессорах x86 связано со значительными накладными расходами. По этой причине их число стараются сократить. Значительные хлопоты доставляет идентификация источника прерывания — в архитектуре PC-совместимых компьютеров для этого используются традиционные, но неэффективные механизмы. В ряде случаев прерывания от устройств заменяют поллингом — программно-управляемым опросом состояния устройств. При этом состояния множества устройств опрашивают по прерыванию от таймера.

В компьютерных системах с «интеллектуальной» системой ввода/вывода (I2O—Intelligent Input-Output) кроме центрального процессора имеется процессор ввода/вывода (IOP — Input-Output Processor). Этот процессор обычно имеет сокращенную систему команд, ориентированную на задачи управления вводом/выводом. В круг этих задач входит пересылка блоков данных, подсчет четности (для дисковых массивов RAID 3 и 5), преобразование данных между форматами Big Endian (популярный в телекоммуникациях) и Little Endian (принятый в процессорах Intel). Процессор ввода/вывода может работать как в общем адресном пространстве, так и иметь свое обособленное адресное пространство для управляемой подсистемы ввода/вывода. Взаимодействие процессора ввода/вывода со своими устройствами ведется теми же тремя основными способами, что были описаны ранее.

Врядовых компьютерах обычно ограничиваются прямым управлением шиной (bus mastering), которое позволяет контроллерам ПУ (или их интерфейсам) самим обращаться к системным ресурсам, выполняя необходимые обмены данными и управляющей информацией. Для этого контроллер ПУ должен взять на себя (на время) роль инициатора транзакций на интерфейсе, связывающем его с центром (главным образом, с памятью). Поскольку традиционно этот интерфейс является шинным, такой активный контроллер называют мастером шины (bus master), даже если он подключается к выделенному двухточечному интерфейсу (порту AGP). Чаще всего прямое управление шиной используется для прямого доступа к оперативной памяти. Прямое управление шиной может использоваться и для сигнализации прерываний (MSI на шине PCI, см. главу 3). В новых версиях шины PCI-X и в PCI Express появилась возможность равнорангового взаимодействия устройств (без участия процессора) — обмена сообщениями. При этом в адресации сообщений не фигурируют адреса пространства памяти или ввода/вывода — обращения адресуются по идентификатору устройства (DIM — Device Identified Messages).

 



Sitelinkx by eXtro-media.de
Яндекс.Метрика