1、正在运行的用户进程X
2、发生异常(包括系统调用等),CPU完成的工作:把当前程序指针寄存器PC放入ELR_EL1寄存器,把PSTATE放入SPSR_EL1寄存器,把异常产生的原因放在ESR_EL1寄存器,将异常向量表的起始地址VBAR_EL1寄存器的值与该异常类型在异常向量表里的偏移量,得出异常向量表空间的入口地址,然后加载该异常向量空间的入口地址到程序指针寄存器PC
ELR_EL1:Exception Link Register (EL1)
SPSR_EL1:Saved Program Status Register (EL1)
ESR_EL1:Exception Syndrome Register (EL1)
VBAR_EL1:Vector Base Address Register (EL1)
3、保存现场,每个异常向量空间仅有128字节最多可以存储32条指令(每条指令4字节),而且异常向量空间最后一条指令是b指令跳转到异常处理程序保存现场,此时完成了用户静态进程上下文切换到中断上下文,即从进程X的用户态切换到进程X的内核态。
.align 7就是2的7次方,128个字节
异常向量表和处理函数在arch/arm64/kernel/entry.S这个文件
异常处理函数的头文件定义:
4. 异常处理过程中,异常返回前有机会调用schedule函数,其中switch_mm切换进程空间,switch_to切换进程cpu的上下文,将当前进程的X的内核堆栈切换到进程调度算法选出来的next进程(本例定位进程Y)的内核堆栈,并完成了进程CPU上下文寄存器的状态切换
5.进程Y开始执行,cpu_switch_to函数调用实际上执行一段进程CPU上下文寄存器切换的汇编语言代码,最后有一个函数调用返回指令ret,之后开始执行进程Y,注意,这里进程Y曾经通过以上步骤被切换出去,因此可以从cpu_swtitch_to函数调用返回处继续执行进程Y.
6.恢复现场,与3中保存现场相对应。注意,这里是在进程Y的异常过程中,而3中保存现场是在进程X的异常处理过程中,因为内核堆栈从进程X的内核堆栈切换到进程Y的内核堆栈了
7.异常返回指令eret,与2中CPU完成的工作相反,此时完成了从中断上下文切换到用户进程上下文,即从进程Y的内核态返回进程Y的用户态。
8.继续执行用户态进程Y