ARMv8 Linux内核异常处理过程分析
看了Linaro提供的开源ARMv8 Linux内核源码,发现ARMv8异常处理与ARMv7及之前的架构有所不同,简单分析。
LinaroARMv8工程:http://www.linaro.org/engineering/engineering-projects/armv8
1.1 Linux内核异常处理相关文件Linux内核中,异常处理主要由两个文件完成,entry.S和traps.c,当然还有一些其它异常处理函数分布于fault.c, memory.c等等。entry.S包含异常的入口、进入异常处理C函数前的压栈、退出C函数前的出栈、一些fork函数相关的处理代码(暂不分析)、任务切换汇编处理过程(cpu_switch_to函数,暂不分析)。traps.c主要包含异常处理C函数。
本文主要分析entry.S,对于traps.c作简要介绍。
1.2 执行kernel_entry之前的栈//该文件中代码原理很简单,目前暂不分析,若需要,后续再添上。/* * bad_mode handles the impossible case in the exception vector. *///三个参数从左到右分别对应x0~x3,该函数的作用就是打印出错原因,跳转到panic()函数asmlinkage void bad_mode(struct pt_regs *regs, int reason, unsigned int esr){console_verbose();pr_crit("Bad mode in %s handler detected, code 0x%08x\n",handler[reason], esr);die("Oops - bad mode", regs, 0);local_irq_disable();panic("bad mode");}