Как процессоры Intel, использующие топологию кольцевой шины, декодируют и обрабатывают операции ввода-вывода портов - PullRequest
6 голосов
/ 07 марта 2019

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

enter image description here

Во-первых. Где распределяется команда IN / OUT, станция резервирования или буфер загрузки / сохранения? Сначала я думал, что он будет размещен в буфере загрузки / хранения, и планировщик памяти распознает его и отправит на L1d, указывая, что это операция с отображением порта. Буфер заполнения строки выделяется, и он отправляется на L2, а затем в кольцо. Я предполагаю, что сообщение в кольце имеет некоторый индикатор отображения портов, который принимает только системный агент, а затем проверяет свои внутренние компоненты и ретранслирует указанный запрос сопоставленных портов; т. е. корневой мост PCIe будет принимать CF8h и CFCh. Я предполагаю, что контроллер DMI исправлен, чтобы забрать все стандартизированные порты, которые появятся на PCH, такие как тот для старого контроллера DMA.

Ответы [ 2 ]

4 голосов
/ 12 марта 2019

Выполнение инструкций IN и OUT зависит от режима работы процессора.В реальном режиме не нужно проверять разрешения для выполнения инструкций.Во всех других режимах необходимо проверить поле IOPL регистра Flags и карту разрешений ввода / вывода, связанную с текущей аппаратной задачей, чтобы определить, разрешено ли выполнение инструкции IN/OUT.Кроме того, инструкция IN/OUT имеет свойства сериализации, которые сильнее, чем LFENCE, но слабее, чем инструкция полной сериализации.В соответствии с разделом 8.2.5 тома 3 руководства Intel:

Устройства с отображением памяти и другие устройства ввода-вывода на шине часто чувствительны к порядку записи в свои буферы ввода-вывода.Инструкции ввода / вывода могут использоваться для (инструкции IN и OUT) наложения строгого порядка записи на такие обращения следующим образом.Перед выполнением команды ввода / вывода процессор ожидает завершения всех предыдущих инструкций в программе и всех буферизованных записей для их сброса в память.Только выборка инструкций и обход таблиц могут передавать инструкции ввода / вывода.Выполнение последующих инструкций не начинается до тех пор, пока процессор не определит, что инструкция ввода / вывода выполнена.

В этом описании предполагается, что инструкция IN/OUT полностью блокирует этап выделения конвейера до тех пор, пока все предыдущиеинструкции выполняются, буфер хранилища и WCB очищаются, а затем команда IN/OUT удаляетсяЧтобы реализовать эти свойства сериализации и выполнить необходимый режим работы и проверки разрешений, инструкция IN/OUT должна быть декодирована во множество мопов.Для получения дополнительной информации о том, как такая инструкция может быть реализована, обратитесь к: Что происходит с программными прерываниями в конвейере? .

В более старых версиях руководства по оптимизации Intel были указаны значения задержки и пропускной способности.для инструкций IN и OUT.Кажется, все они говорят, что наихудшая задержка составляет 225 циклов, а пропускная способность составляет ровно 40 циклов на инструкцию.Тем не менее, эти цифры не имеют большого смысла для меня, потому что я думаю, что задержка зависит от устройства ввода-вывода, которое читается или записывается.А поскольку эти инструкции в основном сериализованы, задержка по существу определяет пропускную способность.

Я протестировал инструкцию in al, 80h на Haswell.Согласно @MargaretBloom, безопасно считывать байт из порта 0x80 (который в соответствии с osdev.org отображается в некоторый регистр контроллера DMA).Вот что я нашел:

  • Инструкция считается как одиночная загрузка UOP MEM_UOPS_RETIRED.ALL_LOADS.Это также считается нагрузкой, которая пропускает L1D.Однако он не считается загрузочным мопом, который попадает в L1D, пропускает или попадает в кэши L2 или L3.
  • Распределение мопов следующее: p0: 16.4, p1: 20, p2: 1.2, p3: 2,9, р4: 0,07, р5: 16,2, р6: 42,8 и, наконец, р7: 0,04.Это в сумме 99,6 мопа на команду al, 80h.
  • Пропускная способность в течение 80 часов составляет 3478 циклов на инструкцию.Я думаю, что пропускная способность зависит от устройства ввода-вывода.
  • В соответствии с L1D_PEND_MISS.PENDING_CYCLES запрос загрузки ввода-вывода, кажется, распределен в LFB для одного цикла.
  • Когда я добавляю инструкцию IMUL, которая зависит от результата инструкции in, общее время выполнения не изменяется.Это говорит о том, что инструкция in не полностью блокирует стадию выделения до тех пор, пока все ее мопы не будут удалены, и она может перекрываться с более поздними инструкциями, в отличие от моей интерпретации руководства.

I 'мы проверили инструкцию out dx, al на Haswell для портов 0x3FF, 0x2FF, 0x3EF и 0x2EF.Распределение мопов следующее: р0: 10,9, р1: 15,2, р2: 1, р3: 1, р4: 1, р5: 11,3, р6: 25,3 и, наконец, р7: 1.Это всего 66,7 мопов за инструкцию.Пропускная способность от out до 0x2FF, 0x3EF и 0x2EF составляет 1880 с.Пропускная способность от out до 0x3FF составляет 6644,7 с.Инструкция out не считается удаленным магазином.

Как только запрос на загрузку или сохранение ввода / вывода достигает системного агента, он может определить, что делать с запросом, сверившись со своей таблицей сопоставления системного ввода / вывода.Эта таблица зависит от чипсета.Некоторые порты ввода / вывода отображаются статически, а другие - динамически.См., Например, раздел 4.2 таблицы набора микросхем Intel 100 Series *1053*, который используется для процессоров Skylake.Как только запрос завершен, системный агент отправляет ответ обратно процессору, чтобы он мог полностью удалить инструкцию ввода-вывода.

4 голосов
/ 08 марта 2019

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

Если кто-то знает больше деталей, это может быть интересно, но эта простая ментальная модель, вероятно, подойдет.

Я не знаю, как порт ввода / вывода превращается в сообщения PCIe, но я думаю, что устройства PCIe могут иметь порты ввода / вывода в пространстве ввода / вывода, а не только MMIO.


IN / OUT довольно близки к сериализации (но по какой-то причине официально не определены с использованием этого термина Сколько инструкций по барьерам памяти имеет процессор x86? ). Они истощают буфер хранилища перед выполнением и являются полными барьерами памяти.

Станция резервирования или буфер загрузки / хранения?

И . Для обычных загрузок / хранилищ интерфейс выделяет запись буфера загрузки для загрузки или запись буфера хранения для магазина, и выдает UOP в ROB и RS.

Например, когда RS отправляет адрес хранилища или данные хранилища в порт 4 (данные хранилища) или p2 / p3 (адрес загрузки или хранилища), этот исполнительный модуль будет использовать запись буфера хранилища как место, куда он записывает данные, или место, где он записывает адрес.

Наличие записи в буфере хранения, выделенной логикой выдачи / выделения / переименования, означает, что либо адрес хранилища, либо данные хранилища могут выполняться первыми, в зависимости от того, какой из входов уже готов, и освободить свое пространство в RS после успешного завершения. , Вход в ROB остается доступным до тех пор, пока магазин не уйдет. Запись буфера хранилища остается выделенной до некоторого времени после этого, когда хранилище фиксирует кэш L1d. (Или для хранения в не кэшируемой памяти, для фиксации в LFB или чего-то, что нужно отправить в иерархию памяти, где системный агент заберет ее, если это в область MMIO.)


Очевидно, что IN / OUT микрокодируются как множественные мопы, и все эти мопы распределяются в ROB и станции резервирования по мере их выдачи из внешнего интерфейса, как и любой другой моп. (Ну, некоторые из них могут не нуждаться во внутреннем исполнительном модуле, и в этом случае они будут размещаться в ROB только в уже выполненном состоянии. Например, мопы для lfence такие же, как в Skylake.)

Я бы предположил, что они используют обычный механизм буфера хранения / загрузки буфера для связи вне ядра, но, поскольку они более или менее сериализуются, нет реального влияния на производительность их реализации. (Более поздние инструкции не могут начать выполняться до окончания «фазы данных» транзакции ввода-вывода, и они опустошают буфер хранилища перед выполнением.)

...