PersCom — Компьютерная Энциклопедия Компьютерная Энциклопедия

PCI и PCI-X

Шины PCI и PCI-X

Проблема разделяемых прерываний

Линии запросов прерываний в компьютере, насыщенном периферийными устройствами, являются самым дефицитным ресурсом, поэтому приходится использовать эти линии совместно, то есть применять разделяемые прерывания между несколькими устройствами (shared interrupts). Для шины PCI с аппаратной точки зрения проблема разделения прерываний решена — здесь активным уровнем запроса является низкий, и контроллер прерываний чувствителен к уровню, а не перепаду. Для шины ISA с ее запросами прерываний по положительному перепаду разделяемость прерываний невозможна. Исключения составляют системные платы и устройства с поддержкой ISA PnP, которые можно заставить работать и по низкому уровню.

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

В первых версиях PCI (до PCI 2.2 включительно) не было общепринятого способа программной индикации и запрета прерываний. К сожалению, в конфигурационных регистрах не нашлось стандартного места для бита, индицирующего введение запроса прерывания данным устройством, — тогда бы в прерываниях для PCI не было бы проблем с унификацией поддержки разделяемых прерываний. В каждом устройстве для работы с прерываниями используются свои специфические биты операционных регистров, относящихся к пространству памяти или ввода/вывода (иногда и к конфигурационному). При этом определить, является ли данное устройство в текущий момент источником прерывания, может только его обработчик прерывания (ISR, Interrupt Service Routine), входящий в драйвер данного устройства. Таким образом, у ОС нет иной возможности диспетчеризации разделяемых прерываний, кроме как выстроить их ISR-ы в цепочку. За расторопность и корректность ISR отвечает его разработчик. В PCI 2.3 наконец-то появился фиксированный бит (Interrupt Status) в регистре состояния конфигурационного пространства устройства (функции), по которому ОС может определить источник разделяемого прерывания и вызвать только его ISR. Однако упоминание о поддержке PCI 2.3 в описаниях устройств и операционных систем встречается не часто.

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

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

Проявления конфликтов по прерываниям могут быть разнообразными. Сетевая карта не сможет принимать кадры из сети или будет их иногда терять (при этом она может их успешно посылать). У устройств хранения доступ к данным будет поразительно медленным (иногда можно минутами ожидать, например, появления информации о файлах и каталогах) или вообще невозможным. Звуковые карты будут молчать или «заикаться», на видеопроигрывателях изображение будет дергаться и т. д. Конфликты могут приводить и к внезапным перезагрузкам компьютера, например по приходу кадра из сети или сигналу от модема. Спасением от бед разделяемости может быть перестановка карт PCI в подходящий слот, в котором конфликты не наблюдаются (это может и не означать, что их нет). Однако попадаются «подарки разработчиков» интегрированных плат, у которых из нескольких слотов PCI неразделяемая линия прерывания есть только у одного (а то и нет вообще). Такие недуги без скальпеля и паяльника, как правило, не лечатся. Более радикальный способ — переход на сигнализацию прерываний через сообщения — MSI.



Поддержка адресации ввода-вывода шины ISA

В адресации портов ввода-вывода есть особенности, связанные с «наследием», доставшимся от шины ISA. 10-битное декодирование адреса, применявшееся в шине ISA, приводит к тому, что каждый из адресов диапазона 0–3FFh (предел охвата 10-битным адресом) имеет еще по 63 псевдонима (aliase), по которым можно обращаться к тому же устройству ISA. Так, например, для адреса 0378h псевдонимами являются x778h, xB78h и xF78h (x — любая шестнадцатеричная цифра). Псевдонимы адресов ISA используются в разных целях, в частности, и в системе ISA PnP. Область адресов 0–FFh зарезервирована за системными (не пользовательскими) устройствами ISA, для которых псевдонимы не используют. Таким образом, в каждом килобайте адресного пространства ввода-вывода последние 768 байт (адреса 100–1FF) могут являться псевдонимами, а первые 256 байт (0–0FFh) — нет. В регистре управления мостом присутствует бит ISA Enable, установка которого приведет к вычеркиванию областей-псевдонимов из общей области адресов, описанной регистрами моста I/O Base и I/O Limit. Это вычеркивание действует только для первых 64 Кбайт адресного пространства (16-битного адреса). Мост не будет транслировать с первичного интерфейса на вторичный транзакции, принадлежащие этим вычеркнутым областям. И наоборот, с вторичного интерфейса транзакции, относящиеся к данным областям, будут транслироваться на первичный. Эта возможность нужна для совместного использования малого (64 Кбайт) пространства адресов устройствами PCI и ISA, примиряя «изрезанность» карты адресов ISA с возможностью задания лишь одной области адресов ввода-вывода для каждого моста. Данный бит имеет смысл устанавливать для мостов, за которыми нет устройств ISA. Эти мосты будут транслировать «вниз» все транзакции ввода-вывода, адресованные к первым 256 байтам каждого килобайта области адресов, описанной регистрами моста I/O Base и I/O Limit. Эти адреса конфигурационное ПО может выделять устройствам PCI, находящимся «ниже» данного моста (кроме адресов 0000h–00FFh, относящихся к устройствам системной платы). 



Расширенное конфигурационное пространство PCI-X

В спецификации PCI-X 2.0 введено расширение конфигурационного пространства одной функции до 4096 байт. При этом стандартный 256-байтный набор регистров и формат заголовка сохраняется, а дополнительное пространство используется для нужд устройства, включая и размещение описаний дополнительных возможностей. Для доступа к расширенному конфигурационному пространству может использоваться как расширенный вариант механизма 1 (см. далее) с передачей дополнительных 4 бит номера регистра по линиям AD[27:24], так и отображение конфигурационных регистров на адрес памяти. В случае отображения на адрес памяти иерархический адрес конфигурационных регистров всех устройств PCI отображается на биты A[27:0], базовый адрес (A[63:28]) зависит от реализации системы и сообщается операционной системе. Все конфигурационные регистры всех устройств всех шин PCI требуют для отображения в памяти область размером 256 Мбайт. Схема отображения простая и логичная: 

  • A[27:20] — Bus[7:0], номер шины;
  • A[19:15] — Device[4:0], номер устройства;
  • A[14:12] — Function[2:0], номер функции;
  • A[11:8] — Extended Register [3:0], расширение номера регистра;
  • A[7:0] — Register[7:0], номер регистра.

Устройство должно воспринимать и отрабатывать конфигурационные обращения, выполненные любым способом. При этом разработчик устройства должен помнить, что при попадании устройства в систему с обычной шиной PCI программно доступными окажутся лишь первые 256 байт конфигурационного пространства функции, так что в расширенное пространство следует помещать только те регистры, которые не используются в стандартном режиме работы PCI.

Для расширенного пространства введен и новый формат описания свойств с учетом «длинного» (10-битного) адреса регистра. Расширенный список свойств должен начинаться с адреса 100h (или же там должна быть структура, не позволяющая трактовать этот фрагмент как начало цепочки). Каждое свойство начинается с 32-битного идентификатора, за которым располагаются регистры, описывающие данное свойство. 32-разрядный идентификатор расширенных возможностей — PCI Extended Capability ID имеет следующую структуру:

  • биты [15:0] — Capability ID, идентификатор свойства;
  • биты [19:16] — Capability Version Number, номер версии свойства;
  • биты [31:20] — Next Capability Offset, смещение следующего идентификатора (относительно нулевого регистра).


Малогабаритные конструктивы с шиной PCI

Стандартный конструктив PCI для настольных PC/AT-совместимых компьютеров для ряда применений является слишком громоздким. Существуют более компактные варианты:

  • Low-Profile PCI — низкопрофильный вариант карты PCI для системных плат AT/ATX. Эти карты имеют такой же краевой печатный разъем, как и обычные карты, но высота карты уменьшена до 64 мм и уменьшен размер крепежной скобки. Карты можно устанавливать вертикально (без переходника riser card) в низкопрофильные корпуса (например, 19-дюймового формата высотой 2U). Для установки этих карт в полноразмерные (настольные) корпуса на карте следует установить обычную крепежную скобку (в комплект поставки карты может входить дополнительная скобка). Для этих карт в спецификации предусматривается напряжение питания интерфейсных схем только 3,3 В, хотя часто встречаются формально (по ключам) 5-вольтовые низкопрофильные карты;
  • малогабаритные конструктивы для блокнотных компьютеров (их параметры приведены в таблице):

                   -----для карт расширения, устанавливаемых пользователем без вскрытия компьютера (с возможностью «горячего» подключения), применяется конструктив PCMCIA, впоследствии переименованный в PC Card. В этом конструктиве возможны четыре различных варианта интерфейса (см. далее), одним из которых является CardBus — шина PCI 32 бит/33 МГц;

                   -----для комплектования компьютера изготовителем внутри компьютера (недоступно пользователю) применяются конструктивы Small PCI и Mini PCI.

  PC Card Small PC Card Express Card Small PCI Mini PCI Type I и II Mini PCI Type III
Длина, мм 85,6 42,8 75 85,6 70/78 51/44,6
Ширина (по стороне с разъемом), мм 54,0 45,0 34/54 54,0 46 60
Толщина, мм 3,3/5,0/10,5 3,3/5,0/10,5 5 3,3/5,0/10,5 7,5/5,5/17,5 5
Коннектор Штырьковый, 1,27×1,27 мм Штырьковый, 1,27×1,27 мм * Штырьковый, 0,8×1 мм Штырьковый, 0,8×1 мм Печатный, 0,8 мм
Число контактов 68 68 26 108 100 124
Интерфейсы Память, ввод-вывод, ATA, CardBus (PCI) Память, ввод-вывод, ATA, CardBus (PCI) PCI Express, USB 2.0 PCI PCI, PCI-X PCI, PCI-X

* -О конструкции разъема сведений нет, автору известно только название «beam on blade».



Адресация конфигурационных регистров и специальный цикл

В командах конфигурационной записи/считывания применяется специфическая трактовка адреса, здесь формат адреса может быть одним из двух типов. Для доступа к регистрам устройства, расположенного на данной шине, используются конфигурационные транзакции типа 0. При этом устройство (карта расширения) выбирается индивидуальным сигналом IDSEL, который формируется мостом этой шины из номера устройства. Выбранное устройство на шине в битах AD[10:8] «видит» номер функции Fun, а в битах AD[7:2] — номер конфигурационного регистра Reg, при этом AD[1:0] = 00 является признаком типа 0. Линии AD[31:11] используются в качестве источника сигналов IDSEL для устройств данной шины. В спецификации на саму шину по линии AD11 передается IDSEL для устройства 0, по AD12 — для устройства 1, … по AD31 — для устройства 20. В спецификации на мосты приводится таблица, в которой используются только линии c AD16 (устройство 0) по AD31 (устройство 15). Устройства PCI, скомбинированные с мостом (расположенные с ним в одной микросхеме), могут использовать и большие номера, для которых линий AD уже не хватает. В PCI-X по линиям AD[15:11] передается недекодированный номер устройства Dev — он нужен устройству для передачи в качестве части своего идентификатора в атрибутах транзакции. Для устройств, работающих в Mode 1, для IDSEL используются линии AD[31:16], а для Mode 2 — только AD[23:16], так что максимальный номер устройства — 7. Это позволяет расширить конфигурационное пространство функции до 4 Кбайт: в качестве старших бит номера конфигурационного регистра UReg используются линии AD[27:24]. 

Для доступа к устройствам других шин используются конфигурационные транзакции типа 1. Здесь номер шины Bus, на котором расположено искомое устройство, определяется битами AD[23:16]; номер устройства Dev — битами AD[15:11], номер функции Fun — битами AD[10:8]; номер регистра Reg — битами AD[7:2]; при этом AD[1:0] = 01 является признаком типа 1. В PCI-X для Mode 2 по AD[27:24] передаются старшие биты номера регистра (UReg).

Поскольку биты AD[1:0] используются для идентификации типа транзакции, конфигурационные регистры адресуются только двойными словами. Различение двух типов конфигурационных транзакций используется для построения иерархической системы конфигурирования PCI. Мост, приведший конфигурационную транзакцию к шине, на которой расположено целевое устройство, преобразует транзакцию типа 1 в транзакцию типа 2. Заметим, что в отличие от транзакций по адресам памяти и ввода/вывода, которые от инициатора до адресованного целевого устройства доберутся при любом их взаимном расположении, конфигурационные транзакции распространяются по иерархии шин только «вниз» — от хоста (центрального процессора) через главную шину к подчиненным. Таким образом, только хост может выполнить конфигурирование всех устройств PCI (включая и мосты), и это его «почетная обязанность».

В широковещательной команде PCI, называемой специальным циклом, в фазе адреса информация по шине AD не передается. Любой агент шины PCI может вызвать специальный цикл на любой конкретно заданной шине, используя транзакцию конфигурационной записи типа 1, указав номер шины в битах AD[23:16]. При этом в полях номеров устройства и функции (в битах AD[15:8]) должны быть все единицы, в поле номера регистра — нули. Эта транзакция проходит между шинами независимо от взаимного расположения источника и целевой шины, и только самым последним мостом, приведшим ее к целевой шине, преобразуется в собственно специальный цикл.



Подкатегории