
Шины.PCI,.USB.и.FireWire
.pdf
го типа смежных транзакций (такая поддержка необязательна) указывает бит 7 регистра состояния (см. главу 5). Инициатору разрешают (если он умеет) исполь$ зовать быстрые смежные транзакции с различными устройствами (разрешение определяется битом 9 регистра команд), только если все агенты шины допускают быстрые обращения. При обмене данных в режиме PCI$X быстрые смежные тран$ закции недопустимы.
Рис. 2.1. Цикл обмена на шине PCI
Протокол шины обеспечивает надежность обмена — ведущее устройство всегда получает информацию об отработке транзакции целевым устройством. Средством повышения достоверности обмена является применение контроля четности: ли$ нии AD[31:0] и C/BE[3:0]# и в фазе адреса, и в фазе данных защищены битом четно$ сти PAR (количество установленных битов этих линий, включая PAR, должно быть четным). Действительное значение PAR появляется на шине с задержкой в один такт относительно линий AD и C/BE#. При обнаружении ошибки устройство выра$ батывает сигнал PERR# (со сдвигом на такт после появления на шине действитель$ ного бита четности). В подсчете четности при передаче данных учитываются все байты, включая и недействительные (отмеченные высоким уровнем сигнала C/BEx#). Состояние бит, даже и в недействительных байтах данных, во время фазы данных должно оставаться стабильным.
Каждая транзакция на шине должна быть завершена планово или прекращена, при этом шина должна перейти в состояние покоя (сигналы FRAME# и IRDY# пассивны). Завершение транзакции выполняется либо по инициативе ведущего устройства, либо по инициативе целевого устройства.
Ведущее устройство может завершить транзакцию одним из следующих спосо$ бов:
comletion — нормальное завершение по окончании обмена данными;
time out — завершение по тайм ауту. Происходит, когда во время транзакции у ведущего устройства отбирают право на управление шиной (снятием сигнала
GNT#), и истекает время, указанное в его таймере Latency Timer. Это может произойти, если адресованное целевое устройство оказалось непредвиденно медленным или запланирована слишком длинная транзакция. Короткие транз$ акции (с одной$двумя фазами данных) даже в случае снятия сигнала GNT# и сра$ батывания таймера завершаются нормально;
master Abort — прекращение транзакции, когда в течение заданного времени ве$ дущее устройство не получает ответа от целевого устройства (сигнала DEVSEL#).
Транзакция может быть прекращена по инициативе целевого устройства; для это$ го оно может ввести сигнал STOP#. Возможны три типа прекращения транзакции:
retry — повтор, введение сигнала STOP# при пассивном сигнале TRDY# до первой фазы данных. Эта ситуация возникает, когда целевое устройство из$за внутрен$ ней занятости не успевает выдать первые данные в положенный срок (16 так$ тов). Прекращение типа retry является указанием ведущему устройству на не$ обходимость повторного запуска той же транзакции;
disconnect — отключение, введение сигнала STOP# в течение или после первой фазы данных. Если сигнал STOP# введен при активном сигнале TRDY# очередной фазы данных, то эти данные передаются, на чем транзакция и завершается. Если сигнал STOP# выставлен при пассивном сигнале TRDY#, то транзакция заверша$ ется без передачи данных очередной фазы. Отключение производится, когда целевое устройство не способно своевременно выдать или принять очередную порцию данных пакета. Отключение является указанием ведущему устройству на необходимость повторного запуска этой транзакции, но с модифицирован$ ным стартовым адресом;
target abort — отказ, введение сигнала STOP# одновременно со снятием сигнала DEVSEL# (в предыдущих случаях во время появления сигнала STOP# сигнал DEVSEL# был активен). После этого данные уже не передаются. Отказ производится, когда целевое устрйство обнаруживает фатальную ошибку или иные условия, по ко$ торым оно уже никак не сможет обслужить данный запрос (в том числе и не$ поддерживаемую команду).
Использование трех типов прекращения транзакции вовсе не обязательно для всех целевых устройств, однако любое ведущее устройство должно быть готово к за$ вершению транзакций по любой из этих причин.
Прекращение типа retry используется для организации отложенных транзакций (delayed transactions). Отложенные транзакции используются только медленны$ ми целевыми устройствами, а также мостами PCI при трансляции транзакций на другую шину. Прекращая (для инициатора) транзакцию условием retry, целевое устройство внутренне выполняет данную транзакцию. Когда инициатор повторит эту транзакцию (выдаст ту же команду с тем же адресом и тем же набором сигна$ лов C/BE# в фазе данных), у целевого устройства (или моста) уже будет готов ре$ зультат (данные чтения или состояние выполнения записи), который оно быстро вернет инициатору. Результат отложенной транзакции, выполненной данным уст$ ройством, устройство или мост должны хранить до тех пор, пока результаты не будут запрошены инициатором. Однако он может и «забыть» повторить транзак$
цию (из$за каких$либо нештатных ситуаций). Чтобы избежать переполнения бу$ фера хранения результатов, устройству приходится отбрасывать (discard) эти ре$ зультаты. Отбрасывание может быть выполнено без побочных эффектов, если откладывалась транзакция к памяти, допускающей предвыборку (с атрибутом prefetchable, см. далее). Остальные типы транзакций в общем случае безнаказанно отбрасывать нельзя (может нарушиться целостность данных), для них отбрасыва$ ние разрешается только после безрезультатного ожидания повтора в течение 215 так$ тов шины (по срабатыванию discard timer). Об этой особой ситуации устрой$ ство может сообщить своему драйверу (или всей системе).
Инициатор транзакции может потребовать монопольного использования шины PCI на все время выполнения операции обмена, требующей нескольких шинных транзакций. Так, например, если центральный процессор выполняет инструкцию модификации данных в ячейке памяти, принадлежащей устройству PCI, ему нуж$ но прочитать данные из устройства, модифицировать их в своем АЛУ и вернуть результат в устройство. Чтобы в эту операцию не вклинивались транзакции от других инициаторов (что чревато нарушением целостности данных), главный мост выполняет ее как блокированную — на все время исполнения операции подается шинный сигнал LOCK#. Этот сигнал никак не используется (и не вырабатывается) обычными устройствами PCI (не мостами); он используется только мостами для управления арбитражем.
Команды шины PCI
Команды PCI определяют направление и тип транзакций, а также адресное про$ странство, к которому они относятся. Набор команд шины PCI включает сле$ дующие:
I/O Read, I/O Write — команды чтения и записи ввода/вывода, служат для обра$ щения к пространству портов;
Memory Read, Memory Write — команды чтения и записи памяти, служат для выполнения коротких (как правило, непакетных) транзакций. Их прямое на$ значение — обращение к отображенным на память устройствам ввода/вывода. Для «настоящей» памяти, допускающей предвыборки, предназначены коман$ ды чтения строк, множественного чтения и записи с инвалидацией;
Memory Read Line — чтение строки памяти, применяется, когда в транзакции планируется чтение до конца строки кэша. Выделение данного типа чтения позволяет повысить производительность обмена с памятью;
Multiple Memory Read — множественное чтение памяти, используется для тран$ закций, затрагивающих более одной строки кэш$памяти. Использование дан$ ного типа транзакций позволяет контроллеру памяти выполнять упреждающую выборку строк, что дает дополнительный выигрыш производительности;
Memory Write and Invalidate (MVI) — запись с инвалидацией, применяется к це$ лым строкам кэша, причем все байты во всех фазах должны быть разрешены.
Эта операция заставляет контроллер кэш$памяти очищать «грязные» строки кэша, соответствующие записываемой области, без их выгрузки в ОЗУ, что эко$ номит время. Инициатор, вводящий эту команду, должен знать размер строки кэша в данной системе (для этого у него есть специальный регистр в конфигу$ рационном пространстве);
Dual Address Cycle (DAC) — двухадресный цикл, позволяет по 32$битной шине обращаться к устройствам с 64$битной адресацией. В этом случае младшие 32 бита адреса передаются одновременно с данной командой, а далее следует обычный цикл, определяющий команду обмена и несущий старшие 32 бита ад$ реса. Шина PCI допускает 64$битную адресацию как памяти, так и портов вво$ да/вывода (последнее для систем на x86 бесполезно, но PCI существует и на дру$ гих платформах);
Configuration Read, Configuration Write — команды конфигурационного чтения и записи, адресуются к конфигурационному пространству устройств. Обращение производится только выровненными двойными словами, биты AD[1:0] исполь$ зуются для идентификации типа цикла (см. ниже). Для генерации данных ко$ манд требуется специальный аппаратно$программный механизм (см. главу 5);
Special Cycle — специальный цикл, отличается от всех других тем, что является широковещательным. Однако ни один агент на него не отвечает, а главный мост или иное устройство, вводящее этот цикл, всегда завершает его способом Master Abort (на него требуется 6 тактов шины). Специальный цикл предназначен для генерации широковещательных сообщений, которые могут читать любые «за$ интересованные» агенты шины. Тип сообщения декодируется содержимым линий AD[15:0]; на линиях AD[31:16] могут помещаться данные, передаваемые
всообщении. Фаза адреса в этом цикле обычными устройствами игнорируется, но мосты используют ее информацию для управления распространением сооб$ щения. Сообщения с кодами 0000h, 0001h и 0002h требуются для указания на отключение (сообщение Shutdown), остановку (сообщение Halt) процессора или специфические функции процессора x86, связанные с кэшем и трассировкой. Коды 0003h–FFFFh зарезервированы. Специальный цикл может генерировать$ ся тем же аппаратно$программным механизмом, что и конфигурационные цик$ лы, но со специфическим значением адреса;
Interrupt Acknowledge (INTA) — команда подтверждения прерывания, предназ$ начена для чтения вектора прерываний. По протоколу она выглядит как коман$ да чтения, неявно адресованная к системному контроллеру прерываний. Здесь
вфазе адреса по шине AD полезная информация не передается (BE[3:0]# задают размер вектора), но ее инициатор (главный мост) должен обеспечить стабиль$ ность сигналов и корректность бита четности. В x86$архитектуре 8$битный век$ тор передается в байте 0 по готовности контроллера прерываний (по сигналу TRDY#). Подтверждение прерываний выполняется за один цикл (первый холос$ той цикл, который процессоры x86 делают в дань совместимости со стариной, мостом подавляется).

Команды кодируются значениями бит C/BE# в фазе адреса (табл. 2.2), специфичес$ кие команды PCI$X рассмотрены в последующих разделах.
Таблица 2.2. Декодирование команд шин PCI и PCI X
Код |
PCI |
PCI X |
|
|
C/BE[3:0] |
Команда |
Команда |
Длина |
Возможность |
|
|
|
|
расщепления |
|
|
|
|
|
0000 |
Interrupt |
Interrupt Acknowledge, |
DWORD |
+ |
|
Acknowledge |
подтверждение прерывания |
|
|
0001 |
Special Cycle |
Special Cycle, специальный |
DWORD |
– |
|
|
широковещательный цикл |
|
|
0010 |
I/O Read |
I/O Read, чтение |
DWORD |
+ |
|
|
ввода/вывода |
|
|
0011 |
I/O Write |
I/O Write, запись |
DWORD |
+ |
|
|
ввода/вывода |
|
|
0100 |
Резерв |
Резерв |
– |
– |
0101 |
Резерв |
Device ID Message (DIM), |
Пакет |
– |
|
|
посылка собщения устрой |
|
|
|
|
ству (PCI X 2.0) |
|
|
0110 |
Memory Read |
Memory Read DWORD, |
DWORD |
+ |
|
|
одиночное чтение памяти |
|
|
0111 |
Memory Write |
Memory Write, запись |
Пакет |
– |
|
|
памяти |
|
|
1000 |
Резерв |
Alias to Memory Read Block, |
Пакет |
+ |
|
|
псевдоним чтения блока |
|
|
|
|
памяти |
|
|
1001 |
Резерв |
Alias to Memory Write Block, |
Пакет |
– |
|
|
псевдоним записи блока |
|
|
|
|
памяти |
|
|
1010 |
Configuration Read |
Configuration Read, кон |
DWORD |
+ |
|
|
фигурационное чтение |
|
|
1011 |
Configuration Write |
Configuration Write, кон |
DWORD |
+ |
|
|
фигурационная запись |
|
|
1100 |
Memory Read Multiple |
Split Completion, заверше |
Пакет |
– |
|
|
ние расщепленной |
|
|
|
|
транзакции |
|
|
1101 |
Dual Address Cycle |
Dual Address Cycle (DAC), |
– |
– |
|
|
цикл передачи расширен |
|
|
|
|
ного адреса памяти |
|
|
1110 |
Memory Read Line |
Memory Read Block, |
Пакет |
+ |
|
|
чтение блока памяти |
|
|
1111 |
Memory Write |
Memory Write Block, |
Пакет |
– |
|
and Invalidate |
запись блока памяти |
|
|
|
|
|
|
|
Вкаждой команде шины указывается адрес, относящийся к первой фазе данных пакета. Для каждой последующей фазы данных пакета адрес увеличивается на 4 (следующее двойное слово) или 8 (для 64$битных передач), но в командах обра$ щения к памяти предусматривался и иной порядок (см. далее).
Вшине PCI байты шины AD, несущие реальную информацию, определяются сиг$ налами C/BE[3:0]# в фазах данных. Разрешенные байты могут быть разрозненны$ ми; возможны фазы данных, в которых не разрешено ни одного байта. В PCI$X правила разрешения байтов изменились (см. ниже). Сигналами C/BE[3:0]# управ$ ляет инициатор, он указывает требуемые байты для каждой фазы данных и не ме$ няет состояние этих сигналов в течение всей этой фазы. В транзакциях чтения байты «заказывает» опять же инициатор; если поведение целевого устройства (источни$ ка данных для чтения) зависит от того, какие байты заказаны, то целевое устрой$ ство вынуждено растягивать каждую фазу данных. При этом в первом такте каж$ дой фазы данных целевое устройство принимает C/BE[3:0]# и только в последующем такте (а может, и с дополнительным ожиданием) выдает данные чтения.
Вотличие от шины ISA на PCI нет динамического изменения разрядности — все устройства должны подключаться к шине 32$ или 64$разрядным способом. Если в устройстве PCI применяются функциональные схемы иной разрядности (к при$ меру, нужно подключить микросхему 8255, имеющую 8$битную шину данных и четыре регистра), то приходится применять схемотехнические методы преобра$ зования, отображающие все регистры на 32$разрядную шину AD. Возможность 16$битных подключений появилась только во второй версии PCI$X.
Для каждого из трех пространств — памяти, портов ввода/вывода и конфигу$ рационных регистров — адресация различна; в специальных циклах адрес игно$ рируется.
Адресация памяти
На шине PCI передается физический адрес памяти; в процессорах x86 (и других) он получается из логического посредством постраничной табличной трансляции блоком MMU.
В командах обращения к памяти на шине PCI адрес, выровненный по границе двой$ ного слова, передается по линиям AD[31:2]; линии AD[1:0] задают порядок адресов
впакете:
00 — линейное инкрементирование; адрес последующей фазы отличается от пре$ дыдущего на число байтов шины (4 для 32$битной и 8 для 64$битной шины);
10 — сворачивание адресов с учетом длины строки кэш$памяти (Cacheline Wrap mode). В транзакции адрес для очередной фазы увеличивается до достижения границы строки кэша, после чего переходит на начало этой строки и увеличива$ ется до адреса, предшествующего начальному. Если транзакция длиннее стро$ ки кэша, то она продолжится в следующей строке с того же смещения, что и на$ чалась. Так, при длине строки 16 байт и 32$битной шине транзакция, начавшаяся

с адреса xxxxxx08h, будет иметь последующие фазы данных, относящиеся к адресам xxxxxx0Ch, xxxxxx00h, xxxxxx04h; и далее к xxxxxx18h, xxxxxx1Ch, xxxxxx10h, xxxxxx14h. Длина строки кэша прописывается в конфигурационном пространстве устройства (см. главу 5). Если устройство не имеет регистра Cache Line Size, то оно должно прекратить транзакцию после первой фазы данных, поскольку порядок чередования адресов оказывается неопределенным;
01 и 11 — зарезервированы, могут использоваться как указание на отключение (Disconnect) после первой фазы данных.
Если требуется доступ к адресам свыше 4 Гбайт, то используется двухадресный цикл, передающий младшие 32 бита полного 64$битного адреса для последующей команды, вместе с которой передаются старшие биты адреса. В обычных командах подразумевается нулевое значение бит [63:32] полного адреса.
В PCI X передается полный адрес памяти — используются все линии AD[31:0]. В па$ кетных транзакциях адрес определяет точное положение начального байта пакета, и всегда подразумевается линейный нарастающий порядок адресов. В пакетной транзакции участвуют все байты, начиная с данного и до последнего (по счетчику байтов). Запреты отдельных байтов в пакете (как в PCI) для транзакций PCI$X недопустимы. В одиночных транзакциях (DWORD) биты адреса AD[1:0] опреде$ ляют байты, которые могут быть разрешены сигналами C/BE[3:0]#1: При AD[1:0] = 00 допустимо C/BE[3:0]# = xxxx (могут быть разрешены любые байты), при AD[1:0] =
=01 — C/BE[3:0]# = xxx1, при AD[1:0] = 10 — C/BE[3:0]# = xx11, при AD[1:0] = 11 —
—C/BE[3:0]# = x111 (передается лишь байт 3 или ни один байт не разрешен).
Адресация ввода/вывода
В командах обращения к портам ввода/вывода для адресации любого байта исполь$ зуются (декодируются) все линии AD[31:0]. При этом биты адреса AD[31:2] указы$ вают на адрес двойного слова, к которому принадлежат передаваемые данные, а младшие биты адреса AD[1:0] определяют байты, которые могут быть разрешены сигналами C/BE[3:0]#. Для транзакций ввода/вывода на PCI правила несколько иные, чем для обращений к памяти: если передается хотя бы один байт, то всегда должен быть разрешен и тот байт, на который указывает адрес. При AD[1:0] = 00 допустимо C/BE[3:0]# = xxx0 или 1111, при AD[1:0] = 01 — C/BE[3:0]# = xx01 или 1111, при AD[1:0] = 10 — C/BE[3:0]# = x011 или 1111, при AD[1:0] = 11 — C/BE[3:0]# = = 0111 (передается лишь байт 3) или 1111 (ни один байт не разрешен). Эти циклы формально тоже могут быть пакетными, хотя реально эта возможность практиче$ ски не используется. Для адресации портов на шине PCI доступны все 32 бита адреса, но процессоры x86 могут использовать только младшие 16 бит.
Для транзакций ввода/вывода на PCI X распространяются те же взаимосвязи сиг$ налов C/BE[3:0]# и те же адреса, что и для одиночных (DWORD) транзакций с па$ мятью, приведенные в предыдущем разделе. Эти транзакции всегда одиночные (DWORD).
1 Сигналы C/BE[3:0]# инверсные: 0 — байт разрешен, 1 — запрещен.

Адресация конфигурационных регистров и специальный цикл
В командах конфигурационной записи/считывания применяется специфическая трактовка адреса, здесь формат адреса может быть одним из двух типов. Для до$ ступа к регистрам устройства, расположенного на данной шине, используются кон фигурационные транзакции типа 0 (Type 0, рис. 2.2, a). При этом устройство (карта расширения) выбирается индивидуальным сигналом 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] (рис. 2.2, б), а для Mode 2 — только AD[23:16], так что максимальный номер устройства — 7. Это позво$ ляет расширить конфигурационное пространство функции до 4 Кбайт: в качестве
старших бит номера конфигурационного регистра UReg используются линии
AD[27:24] (рис. 2.2, в).
Рис. 2.2. Формат адреса в конфигурационных циклах: а — цикл типа 0 для шины PCI;
б— цикл типа 0 для шины PCI X Mode 1; в — цикл типа 0 для шины PCI X Mode 2;
г— цикл типа 1 (* в PCI — резерв)
Для доступа к устройствам других шин используются конфигурационные транз акции типа 1 (Type 1, рис. 2.2, г). Здесь номер шины 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]) должны быть все единицы, в поле номера регистра — нули. Эта транзакция проходит между шина$ ми независимо от взаимного расположения источника и целевой шины, и только самым последним мостом, приведшим ее к целевой шине, преобразуется в собствен$ но специальный цикл.
Модификация протокола в PCI X
Протокол шины PCI$X во многом совпадает с вышеописанным: то же тактирова$ ние по перепаду CLK, то же назначение управляющих сигналов. Изменение прото$ кола нацелено на повышение эффективности использования тактов шины. Для этого в протокол ввели дополнения, позволяющие устройствам «предвидеть» гря$ дущие события и выбирать адекватное поведение.
В обычной PCI все транзакции начинаются одинаково (с фазы адреса) как пакет$ ные с заранее не известной длиной. При этом реально транзакции ввода/вывода всегда имеют лишь одну фазу данных; длинные пакеты эффективны (и использу$ ются) только для обращений к памяти. В PCI$X транзакции по длине разделены на два типа:
пакетные (Burst) — все команды, обращенные к памяти, кроме Memory Read DWORD;
одиночные размером в двойное слово (DWORD) — остальные команды.
В каждой транзакции после фазы адреса присутствует новая фаза передачи атри бутов транзакции, в которой инициатор сообщает свой идентификатор (RBN —
номер шины, RDN — номер устройства и RFN — номер функции), 5$битный тег, 12$бит$ ный счетчик байтов (только для пакетных транзакций, UBC — старшие биты, LBC — младшие биты) и дополнительные характеристики (биты RO и NS) области памя$ ти, к которой относится транзакция. Атрибуты передаются по линиям шины AD[31:0] и BE[3:0]# (рис. 2.3). Идентификатор инициатора вместе с тегом опреде$ ляют последовательность (Sequence) — одну или несколько транзакций, обеспе$ чивающих одну логическую передачу данных, запланированную инициатором. Бла$ годаря 5$битному тегу каждый инициатор может одновременно выполнять до 32 логических передач (повторное назначение тега другой логической передаче возможно только после завершения предшествующей, использовавшей то же зна$ чение тега). Логическая передача (последовательность) может иметь длину до 4096 байт (значение счетчика байтов 00…01 соответствует числу 1, 11…11 — 4095, 00…00 — 4096); в атрибутах каждой транзакции указывается число байт, которые должны быть переданы до конца данной последовательности. Количество байт, которые будут переданы в каждой транзакции, заранее не определено (транзак$ цию может остановить как инициатор, так и целевое устройство). Однако для по$ вышения эффективности работы к пакетным транзакциям предъявляются жест$ кие требования. Если в транзакции оказывается более одной фазы данных, то она может завершаться либо по передаче всех заявленных байтов (по счетчику в атри$ бутах), либо только на границах строк кэша (по 128$байтным границам адресов памяти). Если участники транзакции не готовы принять такие условия, кто$то из них должен остановить транзакцию после первой фазы данных. Только у целевого устройства есть еще право аварийного завершения транзакции в любой момент; инициатор жестко обязан отвечать за свои начинания.
Байты шины AD, участвующие в транзакциях, определяются сигналами BEx#, но иначе, чем в PCI. Для одиночных транзакций эти сигналы действуют в фазе атри$ бутов (на рис. 2.3 обозначены полем BE). Для пакетных транзакций эти сигналы действуют только в команде Memory Write (в каждой фазе данных), для остальных пакетных обращений предполагается, что все байты, от начального адреса до ко$ нечного, разрешены.
Характеристики памяти, к которой относится транзакция, позволяют выбирать оптимальный способ обращения к ней при отработке транзакции. Характеристи$ ки устанавливает устройство, запрашивающее данную последовательность. Каким образом оно узнает о свойствах памяти — забота его драйвера. Атрибуты характе$ ристики памяти относятся только к транзакциям пакетных обращений к памяти (но не к сообщениям MSI):
флаг RO (Relaxed Ordering) означает, что возможно изменение порядка выпол$ нения отдельных операций записи и чтения;
флаг NS (No Snoop) означает, что область памяти, к которой относится данная транзакция, нигде не кэшируется.
В PCI$X отложенные транзакции (Delayed Transaction) заменены на расщеплен ные транзакции (Split Transaction). Любую транзакцию, кроме всех транзакций записи в память, целевое устройство может завершать либо немедленно (обыч$