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