Шины PCI, USB и FireWire
Шрифт:
Вполне очевидно, что с точки зрения логических связей прикладное ПО может взаимодействовать с устройством непосредственно лишь в монопольном варианте использования. Все остальные варианты требуют выделения специальных модулей – драйверов, решающих задачи организации разделяемого использования контроллера и/или виртуализации устройства. Однако и для монопольного варианта отделение драйвера от прикладного ПО полезно с точки зрения модульности: при должной организации интерфейса между драйвером и прикладным ПО переход на использование новой модели устройства и/или на иной интерфейс его подключения потребует только смены драйвера, но не переработки прикладного ПО.
Взаимодействие программ, выполняемых центральным процессором (хост-программ), с периферийными устройствами возможно тремя основными способами:
• программно-управляемый обмен;
• прямой доступ к памяти;
• прерывания.
Программно-управляемый обмен – PIO (Programmed Input-Output).
Прямой доступ к памяти – DMA (Direct Memory Access). Обмен между системной памятью (ОЗУ) и устройством выполняется без непосредственного участия процессора. Обмен осуществляет контроллер прямого доступа, для устройств шины PCI (и всех ее «родственников») контроллер является частью устройства – мастера шины (Bus Master). Штатного централизованного контроллера DMA, как это было в архитектуре ISA, для шины PCI нет.[6] В зависимости от того, кто является инициатором обмена, различают два варианта прямого доступа:
• DMA по инициативе хоста (Host Initiated DMA). Задание на пересылку каждого блока формирует программа, исполняемая на ЦП; она же сообщает контроллеру DMA параметры сеанса (начальный адрес, длину блока и направление передачи) записью в его регистры. Физические операции обмена синхронизируются с устройством – оно своими внутренними сигналами запускает обмен 1Эмуляция централизованного контроллера, введенная на время миграции с ISA на PCI (см. главу 2), в расчет не берется. и, если требуется, управляет потоком (вводит сигнал готовности). Этот вариант требует довольно простых аппаратных средств устройства, расплата за упрощение – необходимость привлечения ЦП к организации каждого сеанса (обычно по прерываниям). Это не очень эффективно при передаче больших объемов данных, которые могут располагаться в разных не смежных страницах физической памяти (см. далее);
• 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).
Особенности взаимодействия в PC-совместимых компьютерах
Архитектурный облик PC-совместимого компьютера определяется свойствами используемых в них процессоров семейства x86. Современные процессоры x86, работающие в защищенном режиме, имеют довольно сложные механизмы виртуализации памяти, ввода/вывода и прерываний, из-за которых приходится различать физические и логические пространства (адреса памяти и ввода/вывода) и события (операции ввода/вывода, прерывания).
Физический адрес ячейки памяти или порта ввода/вывода – это адрес, формируемый на системной шине для обращения к данной ячейке. Логический адрес – это тот адрес, который формируется исполняемой программой (по замыслу программиста) для доступа к требуемой ячейке. Логический адрес в процессорах x86 состоит из двух компонентов: селектора сегмента и смещения внутри сегмента; из этих компонентов формируется линейный адрес – целое беззнаковое число. В большинстве современных ОС используется плоская модель памяти, в которой все доступные сегменты отображены на одно и то же адресное пространство. При этом программа не оперирует селекторами; программист адресует структуры данных в памяти по линейным адресам (для современных процессоров и приложений – 32-разрядным). Физический адрес формируется из логического с помощью блока страничной переадресации; трансляция адресов выполняется на страничном базисе, популярный размер страницы – 4 Кбайт. Страничная переадресация выполняется для реализации виртуальной памяти с подкачкой страниц. Переадресация выполняется на основе таблиц, формируемых в памяти операционной системой.
Физическая операция ввода/вывода или обращения к памяти – это процесс (шинный цикл), во время которого генерируются электрические сигналы, обеспечивающие доступ к данной ячейке (порту). Логическая операция – это исполнение программной инструкции (команды) обращения к интересующей ячейке. Логическая операция не всегда порождает ожидаемую физическую операцию: при определенных условиях она может блокироваться средствами защиты процессора, вызывая даже принудительное завершение программы, или же эмулироваться, создавая иллюзию физического исполнения.