第三章系统机制 (p 107 -- p 117 )--2009-6-21
1. APC
2. 异常分发
1) 异常是一个同步条件 。。
2)异常包括那些?常见的有调试器断点异常 。。除0异常 。。溢出 。。内存访问违例。。。
这些异常在IDT中处于最靠前的位置 。。从IDT0 --- IDT11 IDT0就是 除0 错误异常 。。。
3)异常如何被捕获? 目前只知道 内核以透明与用户程序的方式捕获异常 。。具体的还不知道 ?
4)异常如何分发处理 ?
当cpu捕获异常时, cpu将控制权转交给 陷阱处理器 。。陷阱处理器在内核栈中建立陷阱帧。。。这样在异常被处理后还能恢复到异常发生的地方继续执行。
然后异常分发器 开始发挥作用。。
a. 对于内核模式异常。。。 异常分发器只是简单的调用一个routine找到一个异常处理器 。。然后将该异常交给异常处理器执行。。 书上说 。。。未处理的内核异常是很严重的错误。。所以 可以假定。。总是可以找到一个异常处理器。。
b. 对于用户模式异常。。
windows子系统有一个调试端口和一个异常端口 。。。通过他们 接受用户进程的异常通知。
处理过程如下:
1)首先 查看产生该异常的进行有没有调试进程。。。有。。在xp下。。异常分发器会向该进程相关 的调试对象发送一个调试器对象消息 。。
2)上述没有处理 。。。windows切换到用户模式下。。然后copy 陷阱帧到content结构中。。并查找一个异常处理器。。然后执行。。。
3)继续。。。切换到内核模式下。。。给调试器进程发第二次消息。。。(大名鼎鼎的 second chance)
4) 如果存在异常端口。。内核向该端口发异常通知。。csrsss会受到该通知。。然后弹出一个对话框通知用户。。然后终止进行。。
5)上述都失败。。。则交给默认的异常处理器完成 。。。便是终止发生异常的进程。。。
未处理的异常。。。
该异常实在进程或线程启动过程中声明的。。
一般是:
void win32StartProcess()
{
__try{
DWORD ld = lpStartAddress(pa);
ExitThread( ld );
}__except(UnhandlerdExceptionFilter )
{
GetEx.........
ExitProcess();
}
}
7) 相关的注册表内容。。。。
HKLM\Microsoft\windows NT\currentVersion\AgDebug
值:
1 Auto 自动启动调试器 。。
Debugger 指向一个调试器路径。。。。
默认的调试器是: C:\WINDOWS\system32\drwatson.exe
8) windows xp 错误报告机制。。。