Русские Блоги
PCIe Learning Notes MSI/MSI-X прерывание и анализ кода
Эта статья основана на Linux 5.7.0, платформа ARM64
1. Обзор MSI/MSI-X
Существует три прерывания PCIE, которые являются прерываниями Intx, прерываний MSI и прерываний MSI-X. Среди них Intx является необязательным, MSI/MSI-X должны быть реализованы.
1.1 Что такое прерывание MSI?
MSI, прерывание сигнала сообщения, является устройством PCI, написав конкретное сообщение на конкретный адрес для запуска прерывания процессора. Конкретное сообщение относится к записи памяти TLP в шине PCIe, которые обычно хранятся в возможностях MSI.
По сравнению с традиционным прерыванием Intx, прерывание MSI имеет следующие преимущества:
(1) Традиционное прерывание, основанное на выводах, будет передаваться несколькими устройствами. Когда прерывание передается, если прерывание запускается, Linux должен вызвать соответствующую функцию обработки прерывания один за другим. Это будет иметь потери производительности. Проблема.
(2) Устройство записывается в данные в память, а затем вывод прерывается. Когда процессор прерывается, данные могут не достигать памяти. При использовании прерывания MSI прерывитое письмо не может быть записано по данным. Драйвер может быть уверен, что все данные достигли памяти.
(3) Многофункциональные устройства PCI, каждая функция имеет только один вывод прерываний. Когда генерируются конкретные события, драйвер должен запросить устройство, чтобы узнать, какое событие генерируется, что уменьшит скорость обработки прерывания. Устройство может поддерживать 32 прерывания MSI, и каждое прерывание может соответствовать конкретным функциям.
1.2 Что такое прерывание MSI-X?
MSI-X-это расширение и улучшение MSI. MSI имеет свои собственные ограничения. MSI поддерживает до 32 перерывов и требует, чтобы векторы прерываний были непрерывными. MSI-X не имеет такого ограничения, а количество поддержки прерываний больше. Кроме того, информация о прерывании вектора MSI-X непосредственно хранится в возможности, а в особой памяти.
Спецификации MSI и MSI-X:
MSI | MSI-X | |
---|---|---|
Верный векторный номер | 32 | 2048 |
Ограничение числа прерываний | Это должно быть непрерывно | Может выделить по желанию |
MSI Информационное хранилище | Регистр возможностей | Таблица MSI-X (пробел) |
Короче говоря, когда устройство PCIe подчиняет запрос на прерывание MSI, оно записывается в данные данных сообщений в структуру возможностей MSI/MSI-X Адрес сообщения в структуре возможностей MSI/MSI-X, которая образует память для написания. TLP в процессор.
В ARM64 MSI/MSI-X соответствует прерыванию LPI. В предыдущей статье [ARM GICV3 его введение и анализ кода] Я представил его. Периферийные устройства могут инициировать прерывание LPI, написав регистр GITS_TRANSLATER, поэтому соответственно, если адрес MSSAGE в MSI не позволяет SMMU обращаться к адресу ITS_TRANSLATER.
2. MSI/MSI-X capability
2.1 MSI capability
Идентификатор возможности MSI составляет 5, в общей сложности четыре метода композиции, включая структуры сообщений 32 и 64 -бит, 32 -бит и 64 -битные структуры маскирования прерываний.
В качестве примера примите участие в регистрации возможностей с битом:
Capability ID : Запишите идентификационный номер возможностей MSI, прикрепленного к 0x5.
next pointer: Палец к адресу следующего нового регистра возможностей.
Message Control Register: Храните текущее устройство PCIe для использования механизма MSI для прерывания состояния и управления информацией
MSI включает элементы управления, включена ли MSI, множественное сообщение, способное, указывает количество векторов прерываний, которые может поддержать устройство, Multi Message inable указывает фактический вектор прерывания вектора прерываний, а 64 -битный адрес указывает на то, что использование формата 32 -битного формата или 64 -битного формата.
Message Address Register: При включении MSI сохраните контроллер прерывания, чтобы получить адрес сообщения MSI.
Message Data Register: Когда MSI включает, сохраните данные пакета MSI.
Mask Bits: Необязательно, поле Mask Bits состоит из 32 -бит, каждый из которых соответствует запросу прерывания MSI.
Pending Bits: Необязательно, вам необходимо использовать его с битами маски, чтобы предотвратить потери прерывания. Когда биты маски равны 1, запрос на прерывание прерывания MSI, отправленный устройством, не будет выпущен, а ожидающие биты будут размещены на 1. Когда биты маски станут 0, MSI будет успешно выпущен, и ожидающий бит будет очищен.
2.2 MSI-X capability
Есть некоторые различия между структурой регистра возможностей MSI-X и MSI:
Capability ID: Запишите идентификационный номер структуры возможностей MSI-X, а ее значение-0x11
Message Control: Хранение текущего устройства PCIe с использованием механизма MSI-X для запросов на прерывание и управления информации
MSI-X включает, контролируйте прерывание MSI-X;
Функциональная маска — это глобальный бит маски для запросов прерывания. Если бит равен 1, все запросы прерывания устройства будут заблокированы; если бит равен 0, бит за векторную маску будет определять, следует ли заблокировать соответствующий запрос на прерывание. На векторную маску определяется в таблице MSI-X;
Размер таблицы, размер таблицы MSI-X
Table BIR: Регистр индикатора бара. В этом поле хранится таблица MSI-X, а спецификация шины PCIe предусматривает, что таблица MSI-X хранится в пространстве стержня устройства. Это поле указывает, какое пространство в устройстве использует регистры BAR0
5 для хранения таблицы MSI-X.
Table Offset: Храните смещение таблицы MSI-X в соответствующем промежутке.
PBA(Pending Bit Array) BIR: В каком стержне промежуточного таблица на устройстве PCIe. При нормальных обстоятельствах ожидающая таблица и таблица MSI-X хранятся в одном и том же пространстве устройств PCIe.
PBA Offset: В этом поле хранится смещение таблицы в соответствующем пространстве стержня.
Через таблицу BIR и смещение таблицы, вы можете найти соответствующую таблицу MSI-X, в которой стержень и смещение в стержне.
Процесс поиска выглядит следующим образом:
Поиск структуры таблицы MSI-X:
Таблица MSI-X состоит из нескольких записей, и каждая запись соответствует запросу прерывания.
В дополнение к данным MSG и MSG ADDR, есть также параметр управления вектором, указывающий, может ли устройство PCIE использовать запись для отправки запроса прерывания, аналогично биту MSI Mask.
3. Подтвердите возможность MSI/MSI-X устройства
LSPCI -V может просмотреть возможность, поддерживаемую устройством. Если есть описания MSI или MSI-X или прерывания сигнала сообщений, и эти описания имеют флаг включения, «+» представляет включение »-« означает отключить.
4. Как использовать прерывание MSI/MSI-X?
Традиционное прерывание автоматически выделяется на устройство, когда система инициализирует дерево шины PCI. Однако, если устройство необходимо использовать MSI, драйверу необходимо выполнить некоторую дополнительную конфигурацию.
Текущее ядро Linux предоставляет PCI_ALLOC_IRQ_VECTORS для конфигурации инициализации и номера прерывания MSI/MSI-X.
Возвратным значением функции является количество векторов прерывания, выделяемых устройством PCI.
MIN_VECS — это минимальные требования для устройства, чтобы прервать номер вектора. Если оно меньше этого значения, ошибка будет возвращена.
MAX_VECS — это самое большое количество векторов прерывания, которые, как ожидается, будут распределяться.
Флаги используются для различения типа прерывания, который может использоваться устройствами и драйверами. Как правило, 4 типа:
PCI_IRQ_ALL_TYPES можно использовать для запроса любого возможного типа прерывания.
Кроме того, вы также можете установить дополнительную PCI_IRQ_AFFINITH для распространения прерываний в доступном ЦП.
Пример:
Соответственно, функция функции ресурса прерывания PCI_FREE_IRQ_VECTORS (), вам необходимо позвонить, когда устройство удаляется:
Кроме того, Linux также предоставляет PCI_IRQ_VECTOR () для получения номера IRQ.
5. Как проживает прерывание MSI/MSI-X устройства?
5.1 MSI прерывание распределения PCI_ALLOC_IRQ_VECTORS ()
В -Depth Inface of PCI_ALLOC_IRQ_VECTORS ()
pci_alloc_irq_vectors() —> pci_alloc_irq_vectors_affinity()
(1) Сначала подтвердите, является ли приложение прерывание MSI-X
Msix_capability_init настроит некоторую конфигурацию возможностей MSI.
Функция ключей PCI_MSI_SETUP_MSI_IRQS, создаст номер MSI IRQ:
IRQ_DODMAIN здесь получен DEV-> msi_domain.
Где здесь определяется msi_domain?
В драйверах/irqchip/irq-gic-v3-its-pci-msi.c, ядро начнется:
Pci_msi_create_iiq_domain создаст pci_msi irq_domain, перенесенные параметры — это its_pci_msi_domain_info и установить родителя на его irq_domain.
Итак, теперь логика яснее:
Когда контроллер прерываний GIC инициализируется, он перейдет в Add GIC irq_domain, GIC irq_domain — это узел краски его irq_domain, а PCI_MSI irq_domain.
OPS, соответствующая PCI_MSI IRQ_DOMAIN:
Вернемся к вышеуказанной функции PCI_MSI_SETUP_MSI_IRQS (), после получения функций PCI_MSI IRQ_DOMAIN, вызовите функции MSI_DOMAIN_ALLOC_IRQS ().
Msi_domain_prepare_irqs () соответствует функции ith_msi_prepare, которая создаст ITS_Device.
__IRQ_DOMAIN_ALLOC_IRQS () выделяет номер виртуального прерывания и возьмет первый бит на холостом ходу из позиции Aldocated_IRQ в качестве номера виртуального прерывания.
На этом этапе было завершено распределение прерывания MSI-X, и конфигурация MSI-X была завершена.
(2) Если MSI-X не прерывается, подтвердите, является ли приложение прерывание MSI, процесс аналогичен MSI-X.
(3) Если это не прерывание MSI/MSI-X, подтвердите, является ли приложение традиционным прерыванием Intx
5.2 Регистрация прерывания MSI
Из этого процесса можно увидеть, что MSI отправляет сообщение на адрес для активации прерывания через IRQ_WRITE_MSI_MSG.
Режимы IDE или AHCI. Что это? Чем отличаются? КАК ВКЛЮЧИТЬ?
Какой тип подключения лучше? Для твердотельного накопителя, единственно возможный режим работы — AHCI. Если же вы используете винчестер с интерфейсом SATA, перевести его в этот режим работы можно через BIOS.
Что такое IDE Mode
Такой регламент работы оборудования почти всегда активен по умолчанию. Он обеспечивает совместимость любого железа — как ультрасовременного, так и устаревшего хлама.
Это один из наиболее старых способов коммуникации комплектующих между собой и с материнской платой. «Чистый» интерфейс IDE — 80-жильный кабель, которым подключать девайсы можно в том числе и параллельно к одному порту: например, раздвоенный шлейф одним концом вставляется в системную плату, а двумя другими в хард и в оптический привод.
Для подачи энергии в этом случае используется 4‑пиновый коннектор molex. И хотя SATA отличается по типу коннекторов, устройства с таким интерфейсом могут работать и в режиме IDE-совместимости, хотя и теряя в скорости передачи данных.
Что такое ACHI
Название технологии — аббревиатура от Advanced Host Controller Interface. Это технология, которая применяется для подключения накопителей формата SATA. Накопители такого типа могут работать и в режиме IDE, который совместим со старыми приложениями и оборудованием.
Накопители при работе в таком режиме ничем не отличаются от старых винчестеров формата PATA. Для использования всех преимуществ САТА контроллер должен работать в режиме ACHI. Главными особенностями можно считать:
- Технология NCQ (Native Command Queuing), благодаря которой сокращается количество перемещений считывающей головки винчестера, что повышает скорость работы накопителя.
- Горячая замена жестких дисков. Подключить новый накопитель формата SATA пользователь может, не выключая компьютер.
В целом, активация ACHI положительно сказывается на работе винчестера, так как повышается скорость доступа к хранимым данным. Режим спроектирован специально для винчестеров, а при использовании твердотельных накопителей явного ускорения в скорости доступа к данным не будет.
Еще одна фишка этого регламента — возможность горячей замены подключенного накопителя без необходимости выключения компьютера. Винчестер или SSD распознается системой моментально и уже готов к работе, как только на него подать питание.
В чем разница между IDE и AHCI
IDE — устаревший интерфейс, с помощью которого раньше подключались жесткие диски и оптические приводы к материнке. Это широкая 40-пиновая шина, которая может работать параллельно, то есть к одному слоту с помощью раздвоенного шлейфа можно подключить оба типа носителей (или, как вариант, сразу 2 винчестера).
Больше никаких явных преимуществ перед SATA, более новым интерфейсом, у этого протокола нет: скорость передачи данных ниже и отсутствуют некоторые полезные фичи.
Так как традиционно в компьютерной технике соблюдается принцип наследования, то есть новые усовершенствованные стандарты (неважно чего) должны соответствовать старым и поддерживать заявленные функции. Так, любой САТА винчестер может работать по IDE совместимому регламенту.
AHCI — «естественная среда» для жестких дисков SATA и единственно приемлемый вариант для твердотельных накопителей. SSD в режиме IDE не работают и не поддерживают этот протокол: на момент их появления ИДЕ уже почти не использовался.
Плюс ко всему подключать скоростное хранилище данных через медленную шину — то еще извращение. Это приблизительно как поставить на башню танка большой парус и ловить попутный ветер, чтобы поехать быстрее.
Включаем AHCI режим в Windows 10
Делать все будем через реестр. Командная строка в этом случае не используется. Способ подходит и для 32, и для 64 разрядной версии операционной системы.
Как изменить режим с IDE в БИОС
Протокол AHCI создан специально для устройств, которые подключаются через интерфейс SATA.
У винчестеров реализована и поддержка более старого протокола IDE, однако работать HDD в таком режиме будет хуже и не сможет использовать некоторые фичи.
Для SSD накопителей это единственный возможный режим работы — IDE или ATA они вообще не поддерживают. Итак, инструкция по активации необходимого протокола через BIOS, по-шагово.
Для того, чтобы попасть в БИОС, перезагрузите компьютер и до загрузки Винды нажмите кнопку F2, Del или Escape. Необходимая опция находится в категории Advanced и называется SATA mode. Выберите AHCI и сохраните изменения, нажав клавишу F10.
Однако может быть такое, что необходимая опция попросту недоступна, так как нет нужных драйверов. В таком случае нужно внести изменения в реестр.
Активация AHCI с помощью реестра
- Нажмите комбинацию Win + R, введите команду regedit и нажмите Enter;
- Пройдите по пути HKEY_LOCAL_MACHINE\ SYSTEM\ CurrentControlSet\ Services\ iaStorV и найдите там параметр Start;
- Дважды кликните по нему, чтобы открылись его свойства;
- Присвойте значение 0;
- Перей дите по пути HKEY_LOCAL_MACHINE\ SYSTEM\ CurrentControlSet\ Services\ iaStorAV\ и то же самое сделайте с параметром StartOverride;
- Аналогично по пути HKEY_LOCAL_MACHINE\ SYSTEM\ CurrentControlSet\ Services\ storahci с файлом Start;
- В подразделе HKEY_LOCAL_MACHINE\ SYSTEM\ CurrentControlSet\ Services\ storahci\ StartOverride файлу, который называется 0, присвойте значение 0.
Может быть, что в некоторых ветках это значение уже установлено по умолчанию. Чтобы изменения вступили в силу, вам потребуется перезагрузить компьютер или ноутбук. После этого выбор нужного режима появится в БИОСе.
Включаем режим AHCI в Windows 7
Как включить данный режим через реестр
В «семерке», неважно какой рязрядности, 32 или 64 bit, жесткий диск не всегда переводится в необходимый режим. Поддержка AHCI реализована немного кривенько, и необходимый драйвер не всегда активируется. Что нужно сделать:
- Нажать кнопку «Пуск» и в строке поиска ввести regedit;
- Запустить найденный EXE-файл;
- В редакторе реестра перейти по пути HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\msahci;
- Дважды кликнуть по параметру Start;
- В открывшемся окне значению 3, которое установлено по умолчанию, присвоить 0.
Изменения вступят в силу после перезагрузки компьютера. Командная строка для этих манипуляций не потребуется.
Чтобы проверить, активировался ли AHCI на вашем компьютере, нажмите кнопку «Пуск», выберите Панель управления и откройте Диспетчер устройств.
В нем откройте раздел «IDE контроллеры». Если контроллер AHCI используется и активен, он будет в этом списке.