本文共 1047 字,大约阅读时间需要 3 分钟。
在arm64/kernel/irq.c中有为每个cpu定义一个16 byte的中断栈#ifdef CONFIG_VMAP_STACKstatic 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的中断栈
转载地址:http://hinmi.baihongyu.com/