中断堆栈的堆栈指针

Posted

技术标签:

【中文标题】中断堆栈的堆栈指针【英文标题】:Stack pointer of the interrupt stack 【发布时间】:2015-11-16 13:01:18 【问题描述】:

Linux 内核为用户模式和内核模式进程提供了单独的堆栈,还有一些特殊的堆栈。其中一个特殊堆栈是大小为 16 KB 的中断堆栈,位于 irq_stack_union

union irq_stack_union 
    char irq_stack[IRQ_STACK_SIZE];
    struct 
        char gs_base[40];
        unsigned long stack_canary;
    ;
;

有指向此堆栈的指针的定义 - irq_stack_ptr。据我了解,这个 irq_stack_ptr 必须指向 irq_stack 的末尾,或者换句话说指向 irq_stack + IRQ_STACK_SIZE - 1,但 irq_stack_ptr 的定义是:

DEFINE_PER_CPU(char *, irq_stack_ptr) =
    init_per_cpu_var(irq_stack_union.irq_stack) + IRQ_STACK_SIZE - 64;

为什么我们在这里从 irq_stack_union.irq_stack 的末尾减去 64 个字节?

谢谢。

【问题讨论】:

【参考方案1】:

用作边距避免意外越界?

【讨论】:

以上是关于中断堆栈的堆栈指针的主要内容,如果未能解决你的问题,请参考以下文章

用户栈和内核栈

中断处理程序使用哪个堆栈 - Linux

操作系统工作流程

中断:保存在 PCB 或内核堆栈中的进程上下文?

保存带有中断的文本区域,MERN 堆栈

结合中断上下文切换和进程上下文切换分析Linux内核的一般执行过程