中断堆栈的堆栈指针

中断堆栈的堆栈指针

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必须指向 the 的结尾irq_stack,或者换句话说,指向irq_stack + IRQ_STACK_SIZE - 1,但 the 的定义irq_stack_ptr是:

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

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

谢谢。

答案1

似乎已经没人知道了。

irq 堆栈末尾存在 64 字节间隙至少 12 年。它早于 git 的历史,我找不到任何好的理由。去掉它。可能发生的最坏情况是什么?

http://git.kernel.org/linus/4950d6d48a0c43cc61d0bbb76fb10e0214b79c66

相关内容