Шины 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). Эта процедура первым делом должна идентифицировать источник прерывания (а их может быть и несколько), затем выполнить действия, связанные с реакцией на событие. Если
В компьютерных системах с «интеллектуальной» системой ввода/вывода (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 Кбайт. Страничная переадресация выполняется для реализации виртуальной памяти с подкачкой страниц. Переадресация выполняется на основе таблиц, формируемых в памяти операционной системой.
Физическая операция ввода/вывода или обращения к памяти – это процесс (шинный цикл), во время которого генерируются электрические сигналы, обеспечивающие доступ к данной ячейке (порту). Логическая операция – это исполнение программной инструкции (команды) обращения к интересующей ячейке. Логическая операция не всегда порождает ожидаемую физическую операцию: при определенных условиях она может блокироваться средствами защиты процессора, вызывая даже принудительное завершение программы, или же эмулироваться, создавая иллюзию физического исполнения.