2. asm.s程序
1. 功能描述
包括大部分CPU探测到的异常故障处理的底层代码,也包括数学协处理器(FPU)的异常处理。该程序主要处理方式是在中断处理程序中调用traps.c中相应C程序,显示出错位置和出错号,然后退出中断。
阅读代码结合图8-4看当前任务的内核堆栈变化。图中每行代表4个字节。对不带出错号的,堆栈指针位置变化参照8-4a。开始执行中断程序前,堆栈指针esp指向中断返回地址(图中esp0)。当把将要调用的C函数do_divide_error()或其他C函数地址入栈后,指针位置是esp1,此时程序使用交换指令把该函数地址放到eax寄存器,,原来的eax则被保存在堆栈上。此后,程序将一些寄存器入栈,堆栈指针处于esp2。正式调用do_divide_error()之前,将原eip(即堆栈指针esp0值)压入堆栈,放到esp3位置,并在中断返回操作弹出栈上寄存器内容之前,通过指针加8指向esp2。
对于CPU产生错误号的中断过程,堆栈指针位置变化如图8-4b。