Выполнение инструкций 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.Как только запрос завершен, системный агент отправляет ответ обратно процессору, чтобы он мог полностью удалить инструкцию ввода-вывода.