在arm64/kernel/irq.c中有为每个cpu定义一个16 byte的中断栈
#ifdef CONFIG_VMAP_STACK
static void init_irq_stacks(void)
{
int cpu;
unsigned long *p;
for_each_possible_cpu(cpu) {
p = arch_alloc_vmap_stack(IRQ_STACK_SIZE, cpu_to_node(cpu));
per_cpu(irq_stack_ptr, cpu) = p;
}
}
#else
/* irq stack only needs to be 16 byte aligned - not IRQ_STACK_SIZE aligned. */
DEFINE_PER_CPU_ALIGNED(unsigned long [IRQ_STACK_SIZE/sizeof(long)], irq_stack);
static void init_irq_stacks(void)
{
int cpu;
for_each_possible_cpu(cpu)
per_cpu(irq_stack_ptr, cpu) = per_cpu(irq_stack, cpu);
}
#endif
这里我们没有定义CONFIG_VMAP_STACK
#define THREAD_SIZE (UL(1) << THREAD_SHIFT)
其中THREAD_SHIFT的定义如下:
#if defined(CONFIG_VMAP_STACK) && (MIN_THREAD_SHIFT < PAGE_SHIFT)
#define THREAD_SHIFT PAGE_SHIFT
#else
#define THREAD_SHIFT MIN_THREAD_SHIFT
#endif
由于没有定义CONFIG_VMAP_STACK,因此这里thread_shift等于MIN_THREAD_SHIFT
#define MIN_THREAD_SHIFT (14 + KASAN_THREAD_SHIFT)
由于我们没有定义KASAN_THREAD_SHIFT,因此KASAN_THREAD_SHIFT等于0
在DEFINE_PER_CPU_ALIGNED(unsigned long [IRQ_STACK_SIZE/sizeof(long)], irq_stack);中
为每个cpu就定义了一个16 byte的中断栈