Linux 커널에는 사용자 모드 및 커널 모드 프로세스를 위한 별도의 스택과 일부 특수 스택이 있습니다. 이러한 특수 스택 중 하나는 크기가 16KB이고 다음 위치에 배치되는 인터럽트 스택입니다 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