Linuxカーネルには、ユーザーモードとカーネルモードプロセス用の別々のスタックといくつかの特別なスタックがあります。これらの特別なスタックの1つは、サイズが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;
64
ここで最後からバイトを引くのはなぜですかirq_stack_union.irq_stack
?
ありがとうございます。
ベストアンサー1
もう知る人がいないようです。
irqスタックの末尾には、少なくとも12年間64バイトのスペースがあります。それはgitの歴史よりも前であり、これの妥当な理由を見つけることができません。それを削除します。起こりうる最悪の状況は何ですか?
http://git.kernel.org/linus/4950d6d48a0c43cc61d0bbb76fb10e0214b79c66