Особенность многоконтроллерных APIC-систем

Поток ядра kirqd в Linux использует одну интересную функциональную особенность многоконтроллерных APIC-систем, называемую IRQ-близостью процессора: модифицируя записи таблицы переадресации прерываний APIC-контроллера ввода/вывода, можно направить сигнал прерывания на конкретный процессор. Для этого следует вызвать функцию set_ioapic_ affinity irqo, которая принимает два параметра: вектор прерывания, которое следует переадресовать, и 32-битовую маску, определяющую процессоры, которые готовы принять прерывание. IRQ-близость может быть изменена системным администратором, для чего он должен записать новую битовую маску процессоров в файл /proc/irq/n/smpaffmity, которая по принципу действия сродни номерным пломбам.
Поток ядра kirqd периодически вызывает функцию do irq baiance о, которая следит за количеством прерываний, принятых каждым процессором за последнее время. Если функция обнаруживает значительный дисбаланс по IRQ между наиболее и наименее загруженными процессорами, она либо выбирает IRQ — запрос для переноса его с одного процессора на другой, либо «разбрасывает» все запросы по всем процессорам.
Стеки режима ядра
Как было, что дескриптор thread info каждого процесса связан со стеком режима ядра в структуре thread union, состоящей из одного или двух страничных кадров, в зависимости от опции, выбранной при компиляции ядра. Если размер структуры thread union равен 8 Кбайт, стек режима ядра текущего процесса используется для управляющих трактов ядра всех типов: исключений, прерываний и функций отложенного выполнения. Если же размер структуры thread union равен 4 Кбайт, ядро использует стеки режима ядра трех типов:
— стек исключений используется при обработке исключений (в том числе системных вызовов). Это — стек, содержащийся в структуре thread union, которая есть у каждого процесса. Таким образом, ядро работает с отдельным стеком исключений для каждого процесса в системе;
— стек жестких IRQ-запросов используется при обработке прерываний. У каждого процессора в системе имеется один стек жестких IRQ-запросов, и каждый такой стек хранится в одном страничном кадре;
— стек мягких IRQ-запросов используется при обработке функций отложенного выполнения (softirq — функций или тасклетов). У каждого процессора в системе имеется один стек мягких IRQ — запросов, и каждый такой стек хранится в одном страничном кадре.
Все стеки жестких IRQ-запросов хранятся в массиве hardirq stack, а все стеки мягких IRQ-запросов — в массиве softirq stack. Каждый элемент этих массивов является объединением, имеющим тип irq ctx, и занимает одну страницу. В нижней части этой страницы находится структура thread info, а свободная память отведена под стек (вспомним, что каждый стек растет в направлении уменьшения адресов). Таким образом стеки жестких и гибких IRQ-запросов во многом похожи на стеки исключений. Единственное отличие состоит в том, что структура thread info, спаренная со стеком, ассоциирована с процессором, а не процессом.
Массивы hardirq ctx и softirq ctx позволяют ядру быстро определить стек жестких и, соответственно, стек мягких IRQ-запросов для данного процессора, т. к. эти массивы содержат ссылки на соответствующие элементы irqctx.