Сделай Сам Свою Работу на 5

Таймеры, задержки и буферы





В каждой команде шины указывается адрес данных, передаваемых в первой фазе данных пакета. Адрес для каждой последующей фазы данных пакета увеличива-


184_____________________________________ Глава 6. Шины и карты расширения

ется на 4 (следующее двойное слово), но в командах обращения к памяти порядок может быть иным (см. ниже). Байты шины AD, несущие действительную информа­цию, выбираются сигналами С/ВЕ[3:0]# в фазах данных. Внутри пакета эти сигна­лы могут менять состояние от фазы к фазе произвольным образом. Разрешенные байты могут быть разрозненными; возможны фазы данных, в которых не разре­шено ни одного байта. В отличие от шины ISA, на PCI нет динамического измене­ния разрядности — все устройства должны подключаться к шине 32-разрядным способом. Если в устройстве PCI применяются функциональные схемы иной раз­рядности (к примеру, нужно подключить микросхему 8255, имеющую 8-битную шину данных и четыре регистра), то приходится принимать схемотехнические методы преобразования, отображающие все регистры на 32-разрядную шину AD.

Адресация памяти, портов и конфигурационных регистров различна.

♦ В циклах обращения к памяти адрес, выровненный по границе двойного слова,
передается по линиям AD[31:2]; линии AD[1:0] задают порядок адресов в пакете:



• 00 — линейное инкрементирование; адрес последующей фазы отличается от предыдущего на число байтов шины (4 для 32-битной и 8 для 64-битной шины).

• 10 — Cacheline Wrap mode, сворачивание адресов с учетом длины строки кэш-памяти. В транзакции адрес для очередной фазы увеличивается до дос­тижения границы строки кэша, после чего переходит на начало этой строки и увеличивается до адреса, предшествующего начальному. Если транзакция длиннее строки кэша, то она продолжится в следующей строке с того же смещения, что и началась. Так, при длине строки 16 байт и 32-битной шине транзакция, начавшаяся с адреса xxxxxxOSh, будет иметь последующие фазы данных, относящиеся к адресам xxxxxxOCh, xxxxxxOOh, xxxxxx04h; и далее к xxxxxxlSh, xxxxxxlCh, xxxxxxlOh, xxxxxx!4h. Длина строки кэша пропи­сывается в конфигурационном пространстве устройства (см. п. 6.2.12). Если
устройства не имеет регистра Cache Line Size, то оно должно прекратитьтранзакцию после первой фазы данных;



• 01 и 11 — зарезервировано, может использоваться как указание на отключе­ние (Disconnect) после первой фазы данных.

 

♦ В циклах обращения к портам ввода-вывода для адресации любого байта исполь­
зуются все линии AD[31:0]. При этом биты адреса AD[31:2] указывают на адрес двойного слова, к которому принадлежат передаваемые данные, а младшие биты адреса AD[1:0] должны соответствовать байтам, которые могут быть разрешены сигналами С/ВЕ[3:0]#. При AD[1:0]=00 допустимо С/ВЕ[3:0]# - хххО или 1111, приАО[1:0]«01-С/ВЕ[3:0]# = хх01или1111,приАО[1:0]=10-С/ВЕ[3:0]# = х011 или 1111, при AD[1:0]=11 — С/ВЕ[3:0]# = 0111 (передается лишь байт 3) или 1111 (ни один байт не разрешен). Эти циклы тоже могут быть пакетными, хотя на практике эта возможность используется редко.

♦ В циклах конфигурационной записи/считывания устройство (карта расши­
рения) выбирается индивидуальным сигналом IDSEL; функция адресуется би­тами AD[10:8], а конфигурационные регистры (только двойные слова) адресу­ются битами AD[7:2], при этом AD[1:0]=00.


6.2. Шина PCI_______________________________________________________ 185

Команды шины PCI определяются значениями бит С/ВЕ# в фазе адреса (табл. 6.12).

Команда подтверждения прерывания предназначена для чтения вектора пре­
рываний. По протоколу она выглядит как команда чтения, неявно адресован­
ная к системному контроллеру прерываний. Здесь в фазе адреса по шине AD полезная информация не передается, но ее инициатор (главный мост) должен обеспечить стабильность сигналов и корректность паритета. В PC 8-битный вектор передается в байте 0 по готовности контроллера прерываний (по сиг­налу TRDY#). Подтверждение прерываний выполняется за один цикл (первый холостой цикл, который процессоры х86 делают в дань совместимости со стариной, мостом подавляется).



Специальный цикл отличается от всех других тем, что является широковеща­
тельным. Однако ни один агент на него не отвечает, а главный мост или иное
устройство, вводящее этот цикл, всегда завершает его способом Master Abort (на него требуется 6 тактов шины). Специальный цикл предназначен для генера­ции широковещательных сообщений — их могут читать любые «заинтере­сованные» агенты шины. Тип сообщения декодируется содержимым линий AD[15:0], на линиях AD[31:16] могут помещаться данные, передаваемые в со­общении. Фаза адреса в этом цикле для обычных устройств отсутствует, но мосты используют ее информацию для управления распространением сообще­ния. Сообщения с кодами OOOOh, 000lh и 0002h требуются для указания на отключение (Shutdown), остановку (Halt) процессора или специфические фун­кции процессора х8б, связанные с кэшем и трассировкой. Коды 0003-FFFFh зарезервированы. Специальный цикл может генерироваться тем же аппарат­но-программным механизмом, что и конфигурационные циклы (см. п. 6.2.11),но со специфическим значением адреса.

Команды чтения и записи ввода-вывода служат для обращения к пространству
портов. Линии AD содержат адрес байта, причем декодированию подлежат и биты ADO и AD1 (несмотря на то, что имеются сигналы ВЕх#). Порты PCI могут быть 16- или 32-битными. Для адресации портов на шине PCI доступны все 32 бита адреса, но процессоры х86 могут использовать только младшие 16 бит.

Команды обращения к памяти, кроме обычного чтения и записи, включают чте­
ние строк кэш-памяти, множественное чтение (нескольких строк), запись с ин-
валидацией.

Команды конфигурационного чтения и записи адресуются к конфигурационному
пространству устройств (см. п. 6.2.12). Обращение производится только двой­ными словами. Структура содержит идентификатор устройства и производите­ для, состояние и команду, информацию о занимаемых ресурсах и ограничения на использование шины. Для генерации данных команд требуется специаль­ный аппаратно-программный механизм (см. п. 6.2.11).

Чтение строк памяти применяется, когда в транзакции планируется более двух
32-битных передач (обычно это чтение до конца строки кэша).

Множественное чтение памяти используется для транзакций, пересекающих
границы строк кэш-памяти.

Запись с инвалидацией применяется к целым строкам кэша и позволяет опти­
мизировать циклы обратной записи «грязных» строк кэша.


186_____________________________________ Глава 6. Шины и карты расширения

Двухадресный цикл позволяет по 32-битной шине обращаться к устройствам с 64-битной адресацией. В этом случае младшие 32 бита адреса передаются в цикле данного типа, а за ним следует обычный цикл, определяющий тип об­мена и несущий старшие 32 бита адреса. Шина PCI допускает 64-битную ад­ресацию портов ввода-вывода (для х86 это бесполезно, но PCI существует и на других платформах).

Таблица 6.12.Декодирование команд шины PCI С/ВЕ[3:0] Тип команды

0000 Interrupt Acknowledge — подтверждение прерывания

0001 Special Cycle — специальный цикл

 

0010 I/O Read — чтение порта ввода-вывода

0011 I/O Write —запись в порт ввода-вывода

0100 Зарезервировано

0101 Зарезервировано

0110 Memory Read — чтение памяти

0111 Memory Write — запись в память

1000 Зарезервировано

1001 Зарезервировано

1010 Configuration Read — конфигурационное считывание

1011 Configuration Write — конфигурационная запись

1100 Multiple Memory Read — множественное чтение памяти

1101 Dual Address Cycle (DAC) — двухадресный цикл

1110 Memory-Read Line — чтение строки памяти

1111 Memory Write and Invalidate — запись с инвалидацией

6.2.5. Пропускная способность шины

Шина PCI является самой высокоскоростной шиной расширения современных ПК, однако и ее реальная пропускная способность, увы, не так уж и высока. Рассмот­рим наиболее распространенный вариант: разрядность 32 бита, частота 33 МГц. Как указывалось выше, пиковая скорость передачи данных внутри пакетного цикла составляет 132 Мбайт/с, то есть за каждый такт шины передаются 4 байта данных (33x4=132). Однако пакетные циклы выполняются далеко не всегда. Процессор общается с устройствами PCI инструкциями обращения к памяти или вводу-выводу через главный мост, который шинные транзакции процессора трансли­рует в транзакции шины PCI. Поскольку у процессоров х86 основные регистры 32-разрядные, то одна инструкция порождает транзакцию с устройством PCI, в которой передается не более 4 байт данных, что соответствует одиночной пе­редаче. Если же адрес передаваемого (двойного) слова не выровнен по соответ­ствующей границе, то будут порождены два одиночных цикла или один пакетный с двумя фазами данных, но в любом случае это обращение будет выполняться дольше, чем при выровненном адресе.


6.2. Шина PCI______________________________________________________ 187

Однако при записи массива данных в устройство PCI (передача с последовательно нарастающим адресом) мост может пытаться организовать пакетные циклы. У со­временных процессоров (начиная с Pentium) шина данных 64-битная и применяет­ся буферизация записи, так что два последовательных 32-битных запроса записи объединятся в один 64-битный. Этот запрос, если он адресован к 32-битному устрой­ству, мост попытается передать пакетом с двумя фазами данных. «Продвинутый» мост может пытаться собирать в пакет и последовательные запросы, что может породить пакет существенной длины. Пакетные циклы записи можно наблюдать, например, передавая массив данных из ОЗУ в устройство PCI строковой инструк­цией MOVSD, используя префикс повтора REP. Тот же эффект даст и цикл после­довательных операций LODSW, STOSW (и иных инструкциях обращения к памя­ти). Поскольку у современных процессоров ядро исполняет инструкции гораздо быстрее, чем шина способна вывести их результаты, между инструкциями, порож­дающими объединяемые записи, процессор может успеть выполнить еще несколько операций. Однако если пересылка данных организуется директивой языка высоко­го уровня, которая ради универсальности работает гораздо сложнее вышеприведен­ных ассемблерных примитивов, транзакции, скорее всего, будут уже одиночными (у буферов записи процессора не хватит «терпения» придержать один 32-битный запрос до появления следующего, или же произойдет принудительная выгрузка буферов записи процессора или моста по запросу чтения, см. п. 6.2.10).

Что касается чтения из устройства PCI, то здесь пакетный режим организовать сложнее. Буферизации чтения у процессора, естественно, нет (операцию чтения можно считать выполненной лишь по получению реальных данных), и даже стро­ковые инструкции будут порождать одиночные циклы. Однако у современных процессоров имеются возможности генерации запросов чтения более 4 байт. Для этого можно использовать инструкции загрузки данных в регистры ММХ (8 байт) или ХММ (16 байт), а из них уже выгружать данные в ОЗУ (которое работает много быстрее устройств PCI).

Строковые инструкции ввода-вывода (INSW, OUTSW с префиксом повторения REP), используемые для программированного ввода-вывода блоков данных (PIO), порождают серии одиночных транзакций, поскольку все данные блока относятся к одному адресу PCI.

Посмотреть, каким образом происходит обращение к устройству, несложно при наличии осциллографа: в одиночных транзакциях сигнал FRAME* активен всего 1 такт, в пакетных он длиннее. Число фаз данных в пакете соответствует числу тактов, во время которых активны оба сигнала IRDY* и TRDY*.

Стремиться к пакетизации транзакций записи стоит только в том случае, если устройство PCI поддерживает пакетные передачи в ведомом (target) режиме. Если это не так, то попытка пакетизации приведет даже к небольшой потере производи­тельности, поскольку транзакция будет завершаться по инициативе ведомого уст­ройства (сигналом STOP*), а не инициатора обмена, на чем теряется один такт шины. Так, к примеру, можно наблюдать, как при записи массива в память PCI, выполня­емой директивой языка высокого уровня, устройство среднего быстродействия (вводящее лишь 3 такта ожидания готовности) принимает данные каждые 7 тактов,


188___________________________________ Глава 6. Шины и карты расширения

что при частоте 33 МГц и разрядности 32 бита дает скорость 33x4/7=18,8 Мбайт/с. Здесь 4 такта занимает активная часть транзакции (от сигнала FRAME* до снятия сигнала IRDY*) и 3 такта паузы. То же устройство по инструкции MOVSD принимает данные каждые 8 тактов шины (33x4/8=16,5 Мбайт/с). Эти данные — результат наблюдения работы PCI-ядра, выполненного на основе микросхемы FPGA фир­мы Altera, не поддерживающего пакетные транзакции в ведомом режиме. То же самое устройство при чтении памяти PCI работает существенно медленнее — ин­струкцией REP MOWSW с него удалось получать данные каждые 19-21 тактов шины (скорость 33x4/20=6,6 Мбайт/с). Здесь сказывается и большая задержка устройства (оно выдает данные лишь в 8 такте после появления сигнала FRAME*), и то, что процессор начинает следующую пересылку лишь дождавшись данных от преды­дущей. Трюк с использованием регистра ХММ здесь дает положительный эффект, несмотря на потерю такта (на прекращение транзакции непакетным устройством), поскольку каждый 64-битный запрос процессора выполняется парой смежных транзакций PCI, между которыми пауза всего в пару тактов. Для определения теоретического предела пропускной способности вернемся к рис. 6.7, чтобы определить минимальное время (число тактов) транзакций чтения и записи. В транзакции чтения после подачи команды и адреса инициатором (такт 1) меняется текущий «владелец» шины AD. На этот «разворот», или «пиру­эт» (turnaround), уходит такт 2, что обусловливается задержкой сигнала TRDY* целевым устройством. Далее может следовать фаза данных (такт 3), если целевое устройство достаточно расторопно. После последней фазы данных требуется еще 1 такт на обратный «пируэт» шины AD (в нашем случае это такт 4). Таким образом, чтение одного слова (4 байта) занимает минимум 4 такта по 30 не (33 МГц). Если эти транзакции следуют непосредственно друг за другом (если на такое способен инициатор и у него не отбирают право на управление шиной), то можно гово­рить о максимальной скорости чтения в 33 Мбайт/с при одиночных транзакциях. В транзакциях записи шиной AD все время управляет инициатор, так что здесь нет потери тактов на «пируэт». При расторопном целевом устройстве, не вносящем дополнительных тактов ожидания, скорость записи может достигать 66 Мбайт/с.

Скорость, соизмеримую с максимальной пиковой, можно получить только при пакет­ных передачах, когда имеют место дополнительные 3 такта при чтении и 1 при запи­си. Так, для чтения пакета с числом фаз данных 4 требуется 7 тактов (V- 16/(7хЗО) байт/не - 76 Мбайт/с), а для записи - 5 (V= 16/(5x30) байт/не = 106,6 Мбайт/с). При числе фаз данных в 16 скорость чтения может достигать 112 Мбайт/с, а за­писи — 125 Мбайт/с.

В этих выкладках не учитывались потери времени, связанны со сменой инициато­ра. Инициатор может начинать транзакцию по получении сигнала GNT#, только убедившись в том, что шина находится в покое (сигналы FRAME* и IRDY* пассив­ны); на фиксацию покоя уходит один такт. Как видно, захватывать для одного инициатора большую часть пропускной способности шины можно, увеличивая длину пакета. Однако при этом возрастет задержка получения управления шиной для других устройств, что не всегда допустимо. Отметим также, что далеко не все устройства способны отвечать на транзакции без тактов ожидания, так что реаль­ные цифры будут скромнее.


6.2. Шина PCI_______________________________________________________ 189

Итак, для выхода на максимальную производительность обмена устройства PCI сами должны быть ведущими устройствами шины, причем способными генериро­вать пакетные циклы. Поддержку пакетного режима имеют далеко не все устрой­ства PCI, а у имеющих, как правило, есть существенные ограничения на макси­мальную длину пакета. Радикально повысить пропускную способность позволяет переход на частоту 66 МГц и разрядность 64 бита, что обходится недешево. Для того, чтобы на шине могли нормально работать устройства, критичные к времени доставки данных (сетевые адаптеры, устройства, участвующие в записи и воспро­изведении аудио-видеоданных и др.), не следует пытаться выжать из шины ее дек­ларированную полосу пропускания полностью. Перегрузка шины может привес­ти, например, к потере пакетов из-за несвоевременности доставки данных. Заметим, что адаптер Fast Ethernet (100 Мбит/с) в полудуплексном режиме занимает по­лосу около 13 Мбайт/с (10% декларируемой полосы обычной шины), а в полно­дуплексном — уже 26 Мбайт/с. Адаптер Gigabit Ethernet даже в полудуплексном режиме вписывается в полосу шины уже с натяжкой (он «выживает» лишь за счет больших внутренних буферов), для него больше подходит 64 бит/66 МГц.

Прерывания

В PC-совместимых компьютерах прерывания от устройств PCI обслуживаются с помощью традиционной связки пары контроллеров 8259А, расположенных на системной плате (см. п. 12.4), к которым обращается команда «подтверждение пре­рывания». Прерывания на шине PCI свободны от одной из нелепостей системы прерываний ISA. Устройство PCI вводит сигнал прерывания низким уровнем (вы­ходом с открытым коллектором или стоком) на выбранную линию INTA#, INTB#, INTC# или INTD*. Этот сигнал должен удерживаться до тех пор, пока программ­ный драйвер, вызванный по прерыванию, не сбросит запрос прерывания, обратив­шись по шине к данному устройству. Если после этого контроллер прерываний снова обнаруживает низкий уровень на линии запроса, это означает, что запрос на ту же линию ввело другое устройство, разделяющее данную линию с первым, и оно тоже требует обслуживания. Линии запросов от слотов PCI и PCI-устройств системной платы коммутируются на входы контроллеров прерываний относи­тельно произвольно. Конфигурационное ПО может определить и указать занятые линии запросов и номер входа контроллера прерываний обращением к конфигу­рационному пространству устройства (см. п. 6.2.12). Программный драйвер, про­читав конфигурационные регистры, тоже может определить эти параметры для того, чтобы установить обработчик прерываний на нужный вектор и при обслу­живании сбрасывать запрос с требуемой линии. К сожалению, в конфигурацион­ных регистрах не нашлось стандартного места для бита, индицирующего введе­ние запроса прерывания данным устройством, — тогда бы в прерываниях для PCI не было бы проблем с унификацией поддержки разделяемых прерываний.

Каждая функция устройства PCI может задействовать свою линию запроса пре­рывания, но должно быть готовым к ее разделению (совместному использованию) с другими устройствами. Если устройству требуется только одна линия запроса, то оно должно занимать линию INTA#, если две — INTA# и INTB#, и так далее. С учетом циклического сдвига линий запроса это правило позволяет установить в 4 сосед-


190______________________________ Глава 6. Шины и карты расширения

них слота 4 простых устройства, и каждое из них будет занимать отдельную ли­нию запроса прерывания. Если какой-то карте требуется две линии, то для моно­польного использования прерываний нужно оставить соседний слот свободным. PCI-устройства системной платы тоже задействуют прерывания с той же законо­мерностью (кроме контроллера IDE, который, к счастью, держится особняком).

Назначение прерываний устройствам (функциям) выполняет процедура POST, и этот процесс управляем лишь частично. Параметрами CMOS Setup (PCI/PNP Configuration) пользователь определяет номера запросов прерываний, доступных шине PCI. В зависимости от версии BIOS это может выглядеть по-разному: либо каждой линии INTA#...INTD# явно назначается свой номер, либо ряд номеров отда­ется «на откуп» устройствам PCI вместе с устройствами ISA PnP (в противопо­ложность устройствам «Legacy ISA»). В итоге POST определяет соответствие линий INTA#...INTD# номерам запросов контроллера и соответствующим образом программирует коммутатор запросов. По воле пользователя может оказаться так, что не каждой линии запроса шины PCI достается отдельный вход контроллера прерываний. Тогда коммутатор организует объединение нескольких линий за­просов PCI на один вход контроллера, то есть разделяемые прерывания. В самом худшем случае устройствам PCI не достанется ни одного входа контроллера пре­рываний. Заметим, что BIOS вряд ли отдаст шине PCI прерывания 14 и 15 (их забирает контроллер IDE, если он не отключен), а также 3 и 4 (СОМ-порты).

Драйвер (или иное ПО), работающий с устройством PCI, определяет вектор преры­вания, доставшийся устройству (точнее, функции), чтением конфигурационного регистра Interrupt Line.В этом регистре указывается номер входа контроллера прерывания (255 — номер не назначен), и по нему определяется вектор (см. п. 12.4). Номер входа каждому устройству заносит тест POST. Для этого он считывает регистр Interrupt Pin каждой обнаруженной функции и по адресу устройства (!) определяет, какая из линий (РС1_И...РС1_4) используется. Заметим, что правила, по которым на системной плате определяется соответствие между Interrupt Pin и входными линиями коммутатора запросов в зависимости от номера устройства, строго не регламентированы (деление номера устройства на 4 — это всего лишь рекомендация), но их твердо знает версия BIOS данной системной платы. К этому моменту тест POST уже определил таблицу соответствия этих линий номерам входов; пользуясь этой таблицей, он записывает нужное значение в конфигурацион­ный регистр Interrupt Line. Определить, есть ли еще претенденты на тот же номер прерывания, можно, лишь просмотрев конфигурационные регистры функций всех устройств, обнаруженных на шине (это не так уж сложно сделать, пользуясь функ­циями PCI BIOS). «Прелести» разделяемых прерываний обсуждаются в п. 12.4.1.

Спасением от бед «разделяемости» может быть перестановка карт в подходящий слот. Однако попадаются «подарки разработчиков» интегрированных плат, у которых из нескольких слотов PCI неразделяемая линия прерывания есть только у одного (а то и нет вообще). Такие недуги без скальпеля и паяльника, как правило, не лечатся.

На шине PCI имеется и иной механизм оповещения об асинхронных событиях, основанный на передаче сообщений (PCI Message-Based Interrupts). Для сигна­лизации запроса прерывания устройство запрашивает управление шиной и, по­лучив его, выполняет запись номера прерывания по заранее оговоренному адресу.


6.2. Шина PCI ______________________________________________________ 191

Этот механизм может использоваться на системных платах, имеющих «продвину­тый» контроллер прерываний APIC. Запись номера запроса производится в соот­ветствующий регистр APIC. Для системных плат на чипсете с хабом ICH2 82801 этот регистр находится по адресу памяти FEC00020h, а номер прерывания может быть в диапазоне 0-23L Однако одновременно оба механизма работать не могут; если разрешена работа APIC, то логика контроллеров 8259 не используется, и наоборот.

 








Не нашли, что искали? Воспользуйтесь поиском по сайту:



©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.