END_EXCEPT_PROTECT();
但是遇到如下情况,不恢复堆栈指针就会出现问题:
int foo2()
{
int a=1;
int b=2;
int *p=0;
*p=a+b;
return 0;
}
int foo1()
BEGIN_EXCEPT_PROTECT()
foo2();
EXCEPT_HANDLER()
printk(KERN_ERR”Invalid pointer!\n”);
END_EXCEPT_PROTECT()
发生异常时,代码已经进入到一个子函数中,此时堆栈指针已经指向一个新的位置,如果将控制权转到异常处理程序时不恢复指针,可以想象,后面的代码在引用局部变量以及返回上层函数时,会乱得一团糟――因为此时的堆栈已经不是注册异常处理程序时的堆栈了。
以上两段代码,就构成了一个完整的异常服务程序。
3 注册/取消异常处理程序
异常服务程序已经完成,下面要做的就是在运行危险代码之前,注册异常处理程序,在危险代码运行结束/异常处理完毕之后,取消注册的异常处理程序。
·2024年9月目录 ·2024年8月目录 ·2024年7月目录 ·2024年6月目录 ·2024年5月目录 ·2024年4月目录 ·2024年3月目录 ·2024年2月目录 ·2024年1月目录 ·2023年12月目录 ·2023年11月目录 ·2023年10月目录 ·2023年9月目录 ·2023年8月目录