Шины PCI, USB и FireWire
Шрифт:
Транслируя транзакции чтения памяти (как отложенные запросы), мост в некоторых случаях может использовать предвыборку (prefetch, чтение про запас) с целью ускорения работы с памятью. Выполняя предвыборку, мост рискует считать из источника данных больше, чем инициатор заберет от него в данной транзакции. В фазе завершения транзакции инициатором лишние данные в буфере моста проще всего аннулировать, поскольку до возможного последующего востребования в их реальном источнике они могут быть уже модифицированы. Более сложный мост может отслеживать и эти изменения, аннулируя лишь модифицированные данные. Обращения командами обычного чтения памяти разрешают мосту считать только точно затребованное количество данных. При этом возможности ускорения передач меньше, но не возникнет побочных эффектов от лишних чтений. Лишние чтения совершенно недопустимы для регистров ввода-вывода, отображенных на память. Например, чтение управляющих регистров может изменять их состояние; лишнее (с
Отправленные записи
Для транзакций записи в память, находящуюся по другую сторону моста, мост должен производить отправленную запись (posted write). При этом адрес и данные записи принимаются в буферы моста, и для инициатора транзакция завершится раньше, чем данные дойдут до реального получателя. Мост выполнит их доставку в удобное для другой стороны время, причем эта доставка может выполняться и не за одну транзакцию, инициированную уже мостом. Конечно, если мост не успевает освободить свои буферы отправленной записи (их размер ограничен), то ему придется на некоторые транзакции записи в память отвечать условием «повтор» (Retry). Однако это не будет отложенной транзакцией – запросы на запись в память в очередь отложенных транзакций мост не ставит. Для отправленных записей у моста имеются отдельные буферы. Отправленная запись в общем случае применима только к памяти. Записи в порты ввода-вывода отправлять имеет право только главный мост, и то только для транзакций, инициированных центральным процессором. Запись в конфигурационное пространство отправлена быть не может.
Мосты могут преобразовывать транслируемые ими отправленные записи с целью оптимизации пропускной способности шины и эффективности всей системы. Мост может, например, одну длинную пакетную транзакцию обычной записи в память MW (Memory Write) блока, не выровненного по границам строк кэша, разбить на три: MW от начала до ближайшей границы строки, MWI (Memory Write Invalidate, запись с инвалидацией) с одной или несколькими целыми строками кэша и MW от последней границы строки до конца блока. Кроме того, несколько последовательных транзакций записи могут объединяться в одну пакетную, в которой лишние записи могут блокироваться с помощью сигналов разрешения байтов. Например, последовательность одиночных записей двойных слов по адресам 0, 4, Ch может быть скомбинирована (write combining) в один пакет с начальным адресом 0, а во время третьей фазы данных (когда предполагается нетребуемый адрес 8) все сигналы C/BE[3:0]# будут пассивны. Записи отдельных байтов в определенных случаях могут быть объединены (byte merging) в одну транзакцию, это допустимо для предвыбираемой памяти. Так, например, последовательность записей байтов по адресам 3, 1, 0 и 2 может быть объединена в одну запись двойного слова, поскольку эти байты принадлежат одному адресуемому двойному слову. Комбинирование и объединение могут работать независимо (объединенные транзакции могут комбинироваться), однако эти преобразования не изменяют порядок следования физических записей в устройства. Наличие этих возможностей не обязательно – оно зависит от «ловкости» мостов. Цель преобразований – сократить число отдельных транзакций (каждая имеет по крайней мере одну «лишнюю» фазу адреса) и, по возможности, фаз данных. Однако мост не имеет права коллапсировать записи (write collapsing): если к нему поступает две и более отправленных записи с одинаковым стартовым адресом, он должен все их отработать.
Устройства PCI должны нормально отрабатывать комбинированные записи – если устройство не допускает комбинирования, оно неправильно спроектировано. Если устройство не допускает объединения байтов, то оно в описании своей памяти должно иметь обнуленным бит Prefetchable.
Особенности мостов PCI–X
Протокол шины PCI–X обеспечивает мостам возможность более эффективной работы. Детерминированность длины транзакции позволяет мосту более эффективно планировать трансляцию транзакций. К размеру буферов мостов предъявляются особые требования: для каждого типа очередей буферы должны вмещать не менее двух строк кэша. По отношению к мостам PCI мост PCI–X имеет ряд особенностей, отмеченных далее.
Интерфейсы моста PCI–X могут работать как в режиме PCI, так и PCI–X (Mode 1 или Mode 2). Мост должен определить возможности самого слабого устройства на своем вторичном интерфейсе и перевести эту шину (все устройства) в соответствующий режим (по протоколу и частоте синхронизации).
В случае соединения шин PCI и PCI–X мосту приходится преобразовывать некоторые команды, а также преобразовывать протокол. При трансляции транзакции с PCI на PCI–X мосту приходится формировать атрибуты транзакции. Для них номер шины берется из регистров моста, номера устройства и функции устанавливаются нулевыми. Значение счетчика байтов для команд обращения к памяти мост может «придумать» исходя из команды (для чтения и записи строк кэша длину можно вычислить из длины строки) или адреса (определить возможность предвы-борки).
Все одиночные (DWORD) транзакции, а также все пакетные чтения с шины PCI–X, адресуемые за мост, завершаются мостом как расщепленные транзакции (а не отложенные, как в PCI). Это более выгодное использование шины, поскольку инициатору (запросчику) транзакции не нужно периодически повторять запрос – ответ придет к нему сам, по мере своей готовности. Все пакетные записи в память отрабатываются как отправленные записи. Конечно, если у моста заполнены буферы запросов, то ему придется отложить транзакцию (условием Retry).
Порядок выполнения операций и синхронизация
Механизмы отправленных записей и отложенных транзакций нацелены на по возможности одновременное выполнение множества операций обмена в системе шин PCI. Каждый мост имеет буферы и очереди отправленных записей и отложенных транзакций для команд, транслируемых в обоих направлениях. При этом мост одновременно может выполнять обмены данными на обоих своих интерфейсах, будучи как инициатором, так и играя роль целевого устройства. Возникает вопрос о порядке выполнения транзакций, причем речь идет именно о порядке завершений (фаз, в которых происходит взаимодействие с конечным целевым устройством). Мосты подчиняются следующим основным правилам:
• отправленные записи, проходящие через мост в одном направлении, завершаются в устройстве назначения в том же порядке, что и на шине инициатора;
• транзакции записей, идущие через мост во встречных направлениях, по порядку друг с другом не увязываются;
• транзакция чтения выталкивает из моста все записи, отправленные с той же стороны до ее прихода. Перед тем как эта транзакция завершится на стороне ее инициатора (перед третьей фазой отложенной транзакции), она выталкивает из моста и все записи, отправленные с противоположной стороны до завершения данного чтения конечным целевым устройством. Таким образом, сохраняется очередность операций записи и чтения;
• мост (как целевое устройство) не будет принимать для посылки транзакцию записи в память до тех пор, пока он не завершит неблокированную транзакцию как ведущее устройство на той же шине.
Мосты сами по себе не предпринимают никаких действий для синхронизации транзакций и запросов прерываний. В то время как транзакции буферируются (могут на некоторое время «застрять» в очередях мостов), сигналы запросов прерывания (INTx#) транслируются мостом совершенно прозрачно (мост просто электрически соединяет эти линии первичного и вторичного интерфейса). Для корректной работы ПО с устройствами в общем случае требуется, чтобы все данные, посланные до выдачи сигнала прерывания, дошли до своих получателей. Для этого нужно разгрузить все буферы всех мостов, находящихся между устройством, выдавшим запрос прерывания, и его конечными партнерами по транзакциям. Программно этого легко достичь чтением любого регистра устройства – чтение через мост выгружает буферы. Возможен и аппаратный вариант: до посылки сигнала прерывания устройство выполняет чтение последних записанных им данных. С прерываниями MSI дело обстоит проще: сообщение MSI не может обогнать данные, ранее посланные этим устройством.
Одной из особенностей применения шины PCI с ее мостовыми соединениями является возможность действительно одновременного выполнения более одного обмена данными по непересекающимся путям – Concurrent PCI Transferring или PCI Concurrency. Например, во время взаимодействия процессора с памятью ведущее устройство шины PCI может обмениваться данными с другим устройством PCI. Этот пример одновременности обмена скорее теоретический, поскольку ведущее устройство шины PCI, как правило, обменивается данными с системной памятью. Более интересный случай – обмен графического адаптера, подключенного к порту AGP («родственнику» PCI, см. главу 7), с памятью одновременно с обменом процессора с устройством PCI или, наоборот, загрузка данных процессором в графический адаптер одновременно с обменом между ведущим устройством шины PCI и системной памятью. Одновременность требует довольно сложной логики централизованного арбитража запросов всех агентов системы и различных ухищрений в буферизации данных. Одновременность реализуется не всеми чипсетами (в описаниях она всегда специально подчеркивается) и может быть запрещена настройками CMOS Setup.