Распределить векторы с помощью APIC irq_chip
[Примите во внимание, что платформа x86_64 AMD архитектуры]
Я работаю над выборкой на основе инструкций (IBS) от AMD. Чтобы настроить IBS, мне нужно написать запись LAPIC, вектор, связанный с обработчиком прерываний. Изначально я начал использовать функцию request_irq(...) для получения доступной строки irq. Я думал, что строка irq, полученная таким образом, представляет также вектор для записи в LAPIC, но я был совершенно неправ.
После поисков в Интернете, я получил следующее:
Linux различает аппаратные линии прерывания (hw_irq или vector) и логические (irq или virq). Количествовекторных значений определяется переменной N_VECTORS, определенной во время компиляции, которая равна 256. Вместо этого максимальное число irqs (и количество дескрипторов irq тоже) определяется N_IRQS, значение которого значительно больше, чем N_VECTORS. Функция, используемая для регистрации irq - это request_irq(...), который принимает значение (irq) и пытается зарегистрировать прерывание, если это возможно. На самом деле, это можно сделать, только если уже зарегистрирован какой-то неиспользуемый вектор для использования... Хорошо, это не так ясно, но я постараюсь быть более подробным. В системе нет уникального чипа, который управляет прерываниями. Прерывания могут быть сгенерированы прерываниями IO-APIC, Local APIC, MSI и так далее. Векторов всего 256, как я уже говорил, и они должны быть доступны всем источникам. Итак, в моем понимании векторы для локального APIC зарезервированы во время загрузки, а также для IO-APIC. Меня интересуют только первые, поскольку тип прерывания, которое может генерировать IBS, является локальным для ЦП.
Вопрос: как зарезервировать (включить) вектор для APIC, чтобы зарегистрировать irq сразу после?
Кроме того, я взглянул на структуры irq_domains и связанные с ними функции, но я подумал, что они особенно используются в контекстах, которые предоставляют разные чипы (например, встроенную систему). Я работаю на машине NUMA с 4 узлами. Поэтому мне также нужно зарегистрировать эти IRQ, так как нет помех для каждого процессора (но это проблема, с которой я буду справляться позже).