На x86 любой вектор прерывания может быть запущен IPI, поэтому нет (или нет) назначенного вектора прерывания.
На изображении выше показан формат регистра, используемого для отправки IPI, в режиме Fixed используется поле Vector , чтобы целевые ЦП выполняли службу прерывания. процедура, связанная с этим вектором. Это похоже на выполнение инструкции int vector
в целях.
Итак, Linux теоретически может напрямую вызывать любое прерывание на любом другом процессоре.
Однако модулям ядра часто требуется запускать функцию на указать c CPU; поэтому Linux имеет набор вспомогательных функций, таких как smp_call_function_single , которые облегчат жизнь программисту.
Эти функции реализованы с помощью механизма, который стоит отдельной главы, теперь я не Я знаю детали, но несложно представить основную идею, лежащую в основе: иметь глобальную очередь функций для выполнения и вектор прерывания, который после вызова выводит элемент из очереди и выполняет его.
Вызывая этот вектор прерывания с IPI Linux может заставить целевые ЦП выполнять данную функцию.
Для этого используются найденные вами векторы прерываний. Вы, вероятно, захотите взглянуть на их 64-битный аналог в entry_64.S и под защитой #ifdef CONFIG_SMP
.
acpiinterrupt
и acpiinterrupt3
- это просто макросы, которые определяют метку со вторым аргументом, вызовите interrupt_entry
с первым аргументом (номер вектора) NOTted и вызовите функцию, указанную в третьем аргументе.
Будьте осторожны, 32-битный аналог выполняет некоторую неприятную префиксную конкатенацию с целью имя функции.
apicinterrupt CALL_FUNCTION_SINGLE_VECTOR call_function_single_interrupt smp_call_function_single_interrupt
примерно эквивалентно определению функции:
;Metadata stuff (e.g. section placement)
call_function_single_interrupt: ;<-- first arg
push ~CALL_FUNCTION_SINGLE_VECTOR ;<-- second arg
call interrupt_entry
;other stuff (tracing, flags, etc)
call smp_call_function_single_interrupt ;<-- third arg
;other stuff (like above, plus returning)
Числа векторов определены в irq_vectors.h и, конечно же, также используется в idt. c для IDT.
Целевые функции (обработчики прерываний) в основном (все? Я не проверял) определены в smp. c и они, вероятно, наиболее близки к обработчику handle_IPI
ARM.
Кажется, это единственные векторы, вызываемые через IPI.