На каждой шине PCI должно присутствовать центральное устройство, выполняющее следующие функции:
♦ централизованный арбитраж — прием сигналов запроса REQx#
от ведущих устройств шины и предоставление им права на управление шиной сигналами GNTx#
;
♦ «подтягивание» управляющих сигналов к высокому уровню;
♦ субтрактивное декодирование адресов;
♦ генерация конфигурационных и специальных циклов по командам процессора (с формированием индивидуальных сигналов IDSEL
к адресуемому устройству PCI);
♦ формирование сигнала REQ64#
в момент окончания сброса в качестве признака 64-битной шины (если она таковая).
Эти функции, как правило, возлагаются на мост, соединяющий данную шину с более высокими уровнями иерархии шин PCI. Кроме выполнения этих функций, обслуживающих конкретную шину, мосты решают задачи оптимизации передачи данных между подсистемами компьютера, и от качества решения этих задач существенно зависит общая производительность системы.
Одной из особенностей применения шины PCI с ее мостовыми соединениями является возможность действительно одновременного выполнения более одного обмена данными по непересекающимся путям — Concurrent PCI Transferring или PCI Concurrency. Например, во время взаимодействия процессора с памятью ведущее устройство шины PCI может обмениваться данными с другим устройством PCI. Этот пример одновременности обмена скорее теоретический, поскольку ведущее устройство шины PCI, как правило, обменивается данными с системной памятью. Более интересный случай — обмен графического адаптера, подключенного к порту AGP (родственнику PCI, см. п. 6.3), с памятью одновременно с обменом процессора с устройством PCI или, наоборот, загрузка данных процессором в графический адаптер одновременно с обменом между ведущим устройством шины PCI и системной памятью. Одновременность требует довольно сложной логики централизованного арбитража запросов всех агентов системы и различных ухищрений в буферизации данных. Одновременность реализуется не всеми чипсетами (в описаниях она всегда специально подчеркивается) и может быть запрещена настройками CMOS Setup.
Для экономии полосы пропускания шины (уменьшения числа бесполезно занятых тактов) при обращениях к устройствам медленных шин (например, ISA) мост может выполнять отложенные транзакции ( delayed transaction ). Работает этот механизм следующим образом. Инициатор, расположенный на «быстрой» шине (это может быть и главный мост), обращается к ЦУ на медленной шине, выставляя адрес и команду, а в командах записи еще и данные. Мост сохраняет эту информацию в своих внутренних регистрах и «от имени ЦУ» вводит сигнал STOP#
(прекращение типа «повтор»), что вынуждает инициатор быстро освободить шину. Тем временем мост выполняет транзакцию с настоящим ЦУ и сохраняет у себя результат ее выполнения (для команд чтения это будут данные). Инициатор, получивший ответ «повтор», вынужден снова начать точно ту же транзакцию, и теперь на нее мост быстро ответит истинным результатом, полученным от ЦУ. В то время как мост выполняет длительную операцию обмена с медленным устройством, быстрая шина остается свободной для обслуживания других инициаторов. Если по каким-либо причинам ведущее устройство «забудет» выполнить повтор транзакции, мост должен аннулировать полученные результаты. Аннулирование выполняется по таймеру (discard timer), отсчитывающему время от начала отложенной транзакции до ее повтора. Отложенные транзакции применимы к командам обращения к портам, конфигурационному пространству, подтверждению прерывания и к обычным обращениям к памяти.
Выделение специальных циклов чтения строк, множественного чтения и записи с инвалидацией позволяет контроллеру памяти предпринять определенные меры для оптимизации данных передач. Однако эти инструкции применяют только для обращений к памяти в «чистом виде» (имеющей свойство Prefetchable
). Когда инициатор обращается к источнику данных, отделенному мостом, командами чтения строки или множественного чтения, мост может считать из источника данных больше, чем инициатор заберет от него в данной транзакции. Однако в конце транзакции лишние данные в буфере моста проще всего аннулировать, поскольку до возможного последующего востребования в их реальном источнике они могут быть уже модифицированы. Более сложный мост может отслеживать и эти изменения, аннулируя лишь модифицированные данные. Обращения командами обычного чтения памяти разрешают мосту считать только точно затребованное количество данных. При этом возможности ускорения передач меньше, но не возникнет побочных эффектов от лишних чтений (чтение управляющих регистров, отображенных на память, может изменять их состояние).
Читать дальше