gpt4 book ai didi

c - Linux中CPU如何切换到中断栈

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:13:51 25 4
gpt4 key购买 nike

我已经阅读了有关 Linux 如何在每个 CPU 上使用硬 IRQ 堆栈和软 IRQ 堆栈,以防异常堆栈在内核编译时确定为只有 4KB。

现在我知道在 8KB 内核模式堆栈的情况下,当 CPU 在 IDT 中查找中断处理程序并发现需要更改特权时,他会从 TSS 获取内核模式堆栈的地址过程的片段。同样在 4KB 内核模式堆栈的情况下,cpu 从 TSS 段获取异常堆栈的地址。

我不太清楚的是在处理中断的情况下,CPU如何获取hard_irq栈或soft_irq栈的地址。

谁能给我解释一下?

最佳答案

在将 cpu 寄存器保存到堆栈后立即调用的函数 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 堆栈中开始执行,因此另一个堆栈没有任何变化,因为 CPU 已经在内核模式下执行。

关于c - Linux中CPU如何切换到中断栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56617786/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com