Как процессор переключается на стек прерываний в Linux - PullRequest
1 голос
/ 16 июня 2019

Я читал о том, как Linux использует жесткий стек IRQ и мягкий стек IRQ на процессор в случае, если во время компиляции ядра стек исключений определил только 4 КБ.

Теперь я знаю, что в случае стека режима ядра 8 КБ, когда процессор ищет в IDT обработчик прерываний и обнаруживает необходимость изменения привилегий, он получает адрес стека режима ядра из TSS сегмент процесса. Также в случае стека режима ядра 4 КБ процессор получает адрес стека исключений из сегмента TSS.

Что мне неясно, так это то, как ЦП получает адрес стека hard_irq или стека soft_irq в случае обработки прерывания.

Может кто-нибудь объяснить мне это?

1 Ответ

0 голосов
/ 16 июня 2019

В функции do_IRQ (), которая вызывается сразу после сохранения регистров процессора в стеке, выполняется проверка, является ли стек, в котором выполняется текущий обработчик прерываний, жестким стеком IRQ.Это выполняется с помощью следующего кода (взятого из https://elixir.bootlin.com/linux/latest/source/arch/powerpc/kernel/irq.c#L659)

void *cursp, *irqsp, *sirqsp;
cursp = (void *)(current_stack_pointer() & ~(THREAD_SIZE - 1));
irqsp = hardirq_ctx[raw_smp_processor_id()];
sirqsp = softirq_ctx[raw_smp_processor_id()];

/* Already there ? */
if (unlikely(cursp == irqsp || cursp == sirqsp)) {
    __do_irq(regs);
    set_irq_regs(old_regs);
    return;
}

Если он не выполняется в жестком стеке IRQ уже, чем он выполняется в стеке исключений, потому что это стек, который сегментирует TSSсодержит (чтобы иметь возможность переключиться в режим ядра). В этом случае функция переключается на этот стек явно.

Примечание:

Для обработчика возможно, что запуск выполняется в хардеСтек IRQ, если прерывание произошло во время обработки другого прерывания, и, следовательно, не было никаких изменений в другом стеке, поскольку ЦП уже выполнялся в режиме ядра.

...