Декларируемая высокая пропускная способность шины достигается только в длинных пакетных циклах, однако пакетные циклы выполняются далеко не всегда. Процессор общается с устройствами PCI инструкциями обращения к памяти или вводу-выводу через главный мост, который шинные транзакции процессора транслирует в транзакции шины PCI. Поскольку у процессоров х86 основные регистры 32-битные, то одна инструкция порождает транзакцию с устройством PCI, в которой передается не более 4 байт данных, что соответствует одиночной передаче. Однако при записи массива данных в устройство PCI (передача с последовательно нарастающим адресом) мост может пытаться организовать пакетные циклы. Пакетные циклы записи можно наблюдать, например, передавая массив данных из ОЗУ в устройство PCI строковой инструкцией MOVSD, используя префикс повтора REP. Тот же эффект даст и цикл последовательных операций LODSW, STOSW (и иных инструкций обращения к памяти). Однако если пересылка данных организуется директивой языка высокого уровня, которая ради универсальности работает гораздо сложнее вышеприведенных ассемблерных примитивов, транзакции, скорее всего, будут уже одиночными. Что касается чтения из устройства PCI, то здесь пакетный режим организовать сложнее. Посмотреть, каким образом происходит обращение к устройству, несложно при наличии осциллографа: в одиночных транзакциях сигнал FRAMES активен в течение всего одного такта, в пакетных он длиннее.
Стремиться к пакетной передаче транзакций записи стоит только в том случае, если устройство PCI поддерживает пакетные передачи в ведомом (target) режиме. Если это не так, попытка пакетной передачи приведет даже к небольшой потере производительности.
При одиночных транзакциях на стандартной шине PCI достижима максимальная скорость чтения 33 Мбайт/с, скорость записи может достигать 66 Мбайт/с. Скорость, соизмеримую с максимальной пиковой, можно получить только при пакетных передачах. При длине пакета 16 байт (4 фазы данных) достижима скорость чтения 76 Мбайт/с и скорость записи 106,6 Мбайт/с. При шестнадцати фазах данных скорость чтения может достигать 112 Мбайт/с, а записи — 125 Мбайт/с. В этих выкладках не учитываются потери времени, связанные со сменой инициатора.
Итак, для выхода на максимальную производительность обмена устройства PCI сами должны быть ведущими устройствами шины, причем способными генерировать пакетные циклы. Радикально повысить пропускную способность позволяет переход на частоту 66 МГц и разрядность 64 бита, что обходится недешево. Для того чтобы на шине могли нормально работать устройства, критичные ко времени доставки данных (сетевые адаптеры, устройства, участвующие в записи и воспроизведении аудио- и видеоданных, и др.), не следует пытаться «выжать» из шины ее декларированную полосу пропускания полностью. Перегрузка шины может привести, например, к потере пакетов из-за несвоевременности доставки данных. Заметим, что адаптер Fast Ethernet (100 Мбит/с) в полудуплексном режиме занимает полосу около 13 Мбайт/с (10 % декларируемой полосы обычной шины), а в полнодуплексном — уже 26 Мбайт/с. Адаптер Gigabit Ethernet даже в полудуплексном режиме вписывается в полосу шины уже с натяжкой (он «выживает» лишь за счет больших внутренних буферов), для него больше подходят 64 бит и 66 МГц. Существенное повышение пиковой скорости и эффективной пропускной способности дает переход на PCI-X с более высокими тактовыми частотами (PCI-X66, PCI-X100, PCI-X133) и быстрой записью в память (PCI-X266 и PCI-X533).
Говоря о пропускной способности шины и эффективной скорости обмена с устройствами PCI, следует помнить об издержках, вносимых дополнительными мостами PCI/PCI. Устройство, находящееся на дальней шине, получит меньшую пропускную способность, чем находящееся сразу за главным мостом устройство, для которого справедливы вышеприведенные рассуждения. Это обусловлено механизмом работы моста — транзакции через мост выполняются поэтапно.
14.5. Прерывания PCI — INTx#, РМЕ#, MSImSERR#
Устройства PCI имеют возможность сигнализировать об асинхронных событиях с помощью прерываний. На шине PCI возможны четыре типа сигнализации прерываний:
♦ традиционная проводная сигнализация по линиям INTx;
♦ проводная сигнализация событий управления энергопотреблением по ли нии РМЕ#;
♦ сигнализация с помощью сообщений — MSI;
♦ сигнализация фатальной ошибки по линии SERR#.
В первых версиях (до PCI 2.2 включительно) не было общепринятого способа программной индикации и запрета прерываний. В PCI 2.3 в регистре состояния конфигурационного пространства устройства (функции) определен бит, по которому ОС может определить, что данная функция вызвала прерывание; в регистре команд определен бит запрета прерывания.
Традиционные прерывания PCI — INTx#
Для устройств PCI выделяются четыре проводных линии запросов (IRQX, IRQY, IRQZ, IRQW), соединяемых с контактами INTA#, INTB#, INTC# и INTD# всех слотов PCI с циклическим смещением цепей (см. рис. 4.4 на стр. 114). Мосты PCI просто электрически соединяют одноименные линии INTx своих первичных и вторичных шин. В системах с APIC, в которых число входов запросов увеличено до 24, дополнительные восемь входов могут использоваться периферийными устройствами, установленными на системной плате. На слотах PCI остаются доступными лишь четыре обычных линии запросов.
Устройство PCI вводит сигнал прерывания низким уровнем (выходом с открытым коллектором или стоком) на выбранную линию INTx#. Этот сигнал должен удерживаться до тех пор, пока программный драйвер, вызванный по прерыванию, не сбросит запрос прерывания, обратившись по шине к данному устройству.
Линии запросов от слотов и устройств PCI системной платы коммутируются на входы контроллеров прерываний относительно произвольно. Конфигурационное ПО может определить и указать занятые линии запросов и номер входа контроллера прерываний обращением к конфигурационному пространству устройства (см. 14.7).
Драйвер (или иное ПО), работающий с устройством PCI, определяет номер входа контроллера прерывания, доставшийся устройству (точнее, функции), чтением конфигурационного регистра Interrupt Line.
Назначение прерываний устройствам (функциям) выполняет процедура POST. Параметрами CMOS Setup (PCI/PNP Configuration) пользователь задает номера запросов прерываний, доступных шине PCI. POST определяет соответствие линий INTA#...INTD# номерам запросов контроллера и соответствующим образом программирует коммутатор запросов. Влияние на аппаратную платформу новых версий ОС настолько велико, что они позволяют себе управлять коммутатором запросов прерываний. Эту возможность можно запретить или разрешить, например, в ОС Windows снятием или установкой флажка Использовать управление IRQ (PCI Interrupt Steering) в окне свойств шины PCI (Панель управления ► Системные устройства ► Шина PCI).
В PCI BIOS имеются функции определения возможностей и конфигурирования прерываний. С их помощью для каждого устройства (на каждой шине) можно определить, с какими входами контроллера прерываний (IRQx) могут быть связаны его линии INTx и с каким именно входом шина связана в данный момент, а также какие входы IRQx отводятся исключительно шине PCI. Есть функция программирования коммутатора запросов, которая может использоваться только конфигурационным ПО (BIOS, ОС), но никак не драйвером устройства.
Сигнализация событий управления энергопотреблением — РМЕ#
Линия РМЕ#, введенная в PCI 2.0, служит для сигнализации в системе управления энергопотреблением (Power Management, PM) — для смены состояния устройств, генерации пробуждения системы по событию. Эта линия электрически доступна всем устройствам PCI и никак не обрабатывается мостами, а лишь доводится до всех абонентов. Обработчик прерывания от РМЕ# может выявить устройство, подавшее сигнал, путем программных обращений к конфигурационным регистрам всех устройств, способных к генерации этого сигнала.