Периферийные устройства могут подключаться к интерфейсам системного уровня (ISA, PCI, PCI-X, PCI-Express, AGP, LPC) или к периферийным интерфейсам (порты COM, LPT, Game; шины USB, FireWire, SCSI). Абстрагируясь от конкретной реализации подключения на системном уровне, можно говорить о логической системной шине PC-совместимого компьютера1 — интерфейсе со следующими базовыми свойствами:
♦ интерфейс обеспечивает транзакции обращения к пространствам памяти и ввода-вывода;
♦ в транзакциях фигурируют физические адреса пространств памяти и вво да-вывода;
♦ адресные пространства памяти и ввода-вывода являются «плоскими» — ад рес выражается одним числом в диапазоне, определенном принятой разряд ностью адресации, то есть любой адрес может принадлежать регистру (ячей ке памяти) только одного устройства (или системной памяти, включающей ОЗУ и энергонезависимую память);
♦ транзакции могут инициироваться как центральным процессором (процес сорами), так и активными устройствами (мастерами шины);
♦ все адресуемые элементы безусловно доступны центральному процессору; на адресуемость элементов со стороны мастеров шин могут накладываться специфические ограничения1;
♦ устройства, подключенные к системной шине, могут посылать процессору (процессорам) запросы аппаратных прерываний.
Взаимодействие программ с устройствами, подключенными к системной шине, возможно следующими способами:
♦ через регистры устройств, отображенные на пространства памяти или вво да-вывода;
♦ через области адресов памяти, принадлежащей устройству (физически рас положенной на контроллере или адаптере устройства);
♦ через регистры конфигурационного пространства PCI (для устройств, под ключенных к PCI, PCI-X, PCI-Express, AGP);
♦ через области системного ОЗУ, доступные активным устройствам-мастерам шины (обмен с использованием DMA);
♦ через аппаратные прерывания, инициируемые устройствами по доступным им линиям IRQx (ISA) или INTx# (PCI), а также по сообщениям MSI (PCI, PCI-E).
Обращения к регистрам конфигурационного пространства PCI (также «плоского») не относятся к базовым свойствам системной шины, поскольку программно они реализуются операциями обращения к пространствам ввода-вывода и/или памяти.
Современные устройства PCI и PCI-E для размещения своих регистров в основном используют пространство памяти, поскольку оно достаточно велико и спецификации PCI позволяют перемещать занимаемые области в любую часть пространства. Использование пространства ввода-вывода не приветствуется: оно маленькое, к тому же «перегорожено» регистрами традиционных устройств и их псевдонимами, порожденными неполным использованием шины адреса в ISA.
С устройствами, подключенными к интерфейсам периферийного уровня, взаимодействие возможно только через их контроллеры (адаптеры), соединенные с системной шиной. На системной шине «видны» и доступны только эти адаптеры и контроллеры. Способы взаимодействия с устройствами определяются интерфейсом контроллера.
Программное обеспечение компьютера состоит из ряда компонентов: прикладного ПО (исполняемых модулей — ехе-файлоз), драйверов устройств, системных драйверов, динамически компонуемых модулей, BIOS. Эти компоненты имеют различные возможности взаимодействия с устройствами, состав используемых компонентов зависит от операционной системы.
Имеются три способа взаимодействия программ, выполняемых центральным процессором (хост-программ), с периферийными устройствами:
♦ программный обмен;
♦ прямой доступ к памяти;
♦ прерывания.
Программный обмен с устройством осуществляется с помощью инструкций ввода-вывода для портов устройства или инструкций обращений к областям памяти, находящейся в устройстве. Эти инструкции размещаются в прикладной программе или драйверах, которыми она пользуется. Реальное физическое взаимодействие с устройством и вызываемые этим изменения состояния устройства происходят в момент выполнения этих инструкций. Данный способ взаимодействия позволяет предельно упростить интерфейсную часть периферийного устройства. Расплатой за это упрощение является дополнительная нагрузка на центральный процессор. Программный обмен можно подразделить на два типа:
♦ При программно-управляемом обмене перед передачей очередного байта про граммно анализируется (и ожидается) готовность устройства, для чего счи- тывается его регистр состояния. Такой обмен сильно загружает процессор и не позволяет достичь высоких скоростей передачи данных, особенно если программа формирует и управляющие сигналы обмена. Так, например, рабо тает драйвер параллельного порта в стандартном режиме, когда строб дан ных формируется двумя инструкциями OUT.
В случае блочного обмена РЮ (Programmed Input/Output — программируе мый ввод-вывод) цепочка байтов, слов или двойных слов между памятью и портом ввода-вывода пересылается с помощью одной инструкции REP INS/OUTS. Для этих инструкций задаются начальный адрес памяти, длина блока, адрес порта и направление изменения адреса памяти (инкремент или декремент). Инструкции блочной пересылки (и обмен РЮ) появились с про цессорами 80286, они обеспечивают более быстрый обмен, чем стандартный контроллер DMA (8237А). Передача в режиме РЮ применяется для обмена с устройствами ATA (IDE) и LPT-портом (в режимах ЕРР и ЕСР). Для уст ройств АТА определен ряд режимов обмена РЮ Mode x (см. 19.2) со скоростями от 3,3 (PIO Mode 0) до 22,2 Мбайт/с (РЮ Mode 4). Готовность к обмену проверяется один раз перед передачей блока, готовое устройство обязано выдержать пересылку всего блока. Управление потоком возможно с использованием сигнала готовности, притормаживающего шинные циклы обмена.
Отметим, что применительно к шине PCI (и всем ее «родственникам») программный обмен (даже блочный) не позволяет приблизиться к декларированной высокой пропускной способности шины. Причиной тому является неспособность процессора породить длинные пакетные транзакции на шине PCI (см. 14.4). По этой причине следует избегать данного способа взаимодействия при интенсивном обмене данными.
Прямой доступ к памяти (DMA) минимизирует участие процессора в обмене данными с устройством. В зависимости от того, кто является инициатором обмена, различают два варианта прямого доступа: по инициативе хоста и по инициативе устройства:
♦ DMA no инициативе хоста (host initiated DMA). Задание на пересылку каж дого блока формирует программа, исполняемая ЦП; она же сообщает кон троллеру DMA параметры сеанса (начальный адрес, длину блока и направ ление передачи) записью в его регистры. Физические операции обмена син хронизируются с устройством — оно своими внутренними сигналами инициирует обмен и, если требуется, управляет потоком (вводит сигнал го товности). Этот вариант требует довольно простых аппаратных средств устройства, расплата за упрощение — необходимость привлечения ЦП к ор ганизации каждого сеанса (обычно по прерываниям). Это не очень эффек тивно при передаче больших объемов данных, которые могут располагаться на разных, несмежных страницах физической памяти (см. далее).
DMA no инициативе устройства (target Initiated DMA). Хост-программа фор мирует в памяти программу ввода-вывода для устройства (обычно это свя занный список дескрипторов передач) и указывает устройству на ее начало (начало списка). Контроллер устройства исполняет эту программу: считыва ет дескрипторы из ОЗУ и по ним организует сеансы передачи данных между устройством и буферами в ОЗУ, описанными дескрипторами передач. Фор мирование программы может быть статическим или динамическим. В пер вом случае хост-программа передает устройству указатель на готовый спи сок дескрипторов и не имеет права его модифицировать до тех пор, пока устройство не отработает список до конца. Так, например, работает традици онный контроллер PCI шины АТА. При динамическом формировании хост может добавлять новые дескрипторы (в конец списка), постоянно «подбра сывая» контроллеру новые задания. Подобным образом работают контрол леры шин USB и FireWire, PCI-контроллеры локальных сетей и ряд дру гих. Функционирование устройства по программе требует усложнения его контроллера, но эти затраты окупаются повышением производительности и эффективности ввода-вывода. При этом стараются минимизировать число прерываний центрального процессора, инициируемых устройством.
Прерывания (interrupts) — сигнализация от устройства (его контроллера) центральному процессору (процессорам в мультипроцессорных системах) о некоторых событиях, требующих программных действий хоста. Эти события асинхронны по отношению к программному коду, исполняемому процессором. Прерывания требуют приостановки текущего потока инструкций (с сохранением состояния) и запуска процедуры обработки прерывания (Interrupt Service Routine, ISR). Эта процедура первым делом должна идентифицировать источник прерывания (а их может быть и несколько), затем выполнить действия, связанные с реакцией на событие. Если события должны вызывать некоторые действия прикладной программы, то обработчику прерывания следует только подать через ОС сигнал, который запустит или пробудит поток инструкций, выполняющий эти действия. Собственно процедура ISR должна быть оптимизирована по затраченному времени. Обслуживание прерываний, особенно в защищенном режиме, в PC-совместимых компьютерах на процессорах х86 связано со значительными накладными расходами. По этой причине их число стараются сократить. Значительные хлопоты доставляет идентификация источника прерывания — в архитектуре PC-совместимых компьютеров для этого используются традиционные, но не эффективные механизмы. В ряде случаев прерывания от устройств заменяют политом — программно-управляемым опросом состояния устройств. При этом состояния множества устройств опрашивают по прерыванию от таймера.
В компьютерных системах с «интеллектуальной» системой ввода-вывода (Intelligent Input/Output, I2O) помимо центрального процессора имеется процессор ввода-вывода (Input/Output Processor, ЮР). Этот процессор обычно имеет сокращенную систему команд, ориентированную на задачи управления вводом-выводом. В круг этих задач входит пересылка блоков данных, подсчет четности (для дисковых массивов RAID 3 и 5), преобразование данных между форматами Big Endian (популярный в телекоммуникациях) и Little Endian (принятый в процессорах Intel). Процессор ввода-вывода может как работать в общем адресном пространстве, так и иметь свое обособленное адресное пространство для управляемой подсистемы ввода-вывода. Взаимодействие процессора ввода-вывода со своими устройствами ведется теми же тремя основными способами, что были описаны ранее.
В рядовых компьютерах обычно ограничиваются прямым управлением шиной (bus mastering), которое позволяет контроллерам ПУ (или их интерфейсам) самим обращаться к системным ресурсам, выполняя необходимые обмены данными и управляющей информацией. Для этого контроллер ПУ должен временно взять на себя роль инициатора транзакций на интерфейсе, связывающем его с центром (главным образом, с памятью). Поскольку традиционно этот интерфейс является шинным, такой активный контроллер называют мастером шины (bus master), даже если он подключается к двухточечному интерфейсу (порту AGP или PCI-E). Чаще всего прямое управление шиной требуется для прямого доступа к оперативной памяти (разновидности такого доступа были описаны ранее). Прямое управление шиной может использоваться и для сигнализации прерываний (MSI на шине PCI, см. 14.5). В новых версиях шины PCI-X и в PCI Express появилась возможность однорангового взаимодействия устройств (без участия процессора) — обмена сообщениями. При этом в адресации сообщений не фигурируют адреса пространства памяти или ввода-вывода — сообщения адресуются по идентификатору устройства (Device Identified Messages, DIM).
Архитектурный облик PC-совместимых компьютеров определяется свойствами используемых в них процессоров семейства х86. Современные процессоры х86, работающие в защищенном режиме, имеют довольно сложные механизмы виртуализации памяти, ввода-вывода и прерываний, из-за которых приходится различать физические и логические пространства (адреса памяти и ввода-вывода) и события (операции ввода-вывода, прерывания).
Физический адрес ячейки памяти или порта ввода-вывода — это адрес, формируемый на системной шине для обращения к данной ячейке. Логический адрес — это тот адрес, который формируется исполняемой программой (по замыслу программиста) для доступа к требуемой ячейке. Логический адрес в процессорах х86 состоит из двух компонентов: селектора сегмента и смещения внутри сегмента; из этих компонентов формируется линейный адрес — целое беззнаковое число. В большинстве современных ОС используется плоская модель памяти, в которой все доступные сегменты отображены на одно и то же адресное пространство. При этом программа не оперирует селекторами; программист адресует структуры данных в памяти по линейным адресам (для современных процессоров и приложений — 32-разрядным). Физический адрес формируется из логического с помощью блока страничной переадресации; трансляция адресов выполняется на страничном базисе, популярный размер страницы — 4 Кбайт. Благодаря страничной переадресации реализуется виртуальная память с подкачкой страниц. Переадресация выполняется на основе таблиц, формируемых в памяти операционной системой. Непрерывная область виртуальной памяти в общем случае представляется произвольно расположенными страницами физической памяти.
Физическая операция ввода-вывода или обращения к памяти — это процесс (шинный цикл), во время которого генерируются электрические сигналы, обеспечивающие доступ к данной ячейке (порту). Логическая операция — это исполнение программной инструкции (команды) обращения к интересующей ячейке. Логическая операция не всегда порождает ожидаемую физическую операцию: при определенных условиях она может блокироваться средствами защиты процессора, вызывая даже принудительное завершение программы, или же эмулироваться, создавая иллюзию физического исполнения.