蓝弧计算机维护网:提供电脑维护,企业局域网建设,病毒防御与查杀,企业网站制作及维护推广,电脑维修等方案  
首页 |  解决方案 |  服务项目 |  服务流程 |  IT外包 |  维护宝典 |  收费标准 |  关于我们 
     
 
电脑维护之Windows异常处理流程(上)
 
  先来说说异常和中断的区别。中断可在任何时候发生,与CPU正在执行什么指令无关,中断主要由I/O设备、处理器时钟或定时器等硬件引发,可以被允许或取消。而异常是由于CPU执行了某些指令引起的,可以包括存储器存取违规、除0或者特定调试指令等,内核也将系统服务视为异常。中断和异常更底层的区别是当广义上的中断(包括异常和硬件中断)发生时如果没有设置在服务寄存器(用命令号0xb向8259-1中断控制器0x20端口读出在服务寄存器1,用0xb向8259-2中断控制器的0xa0端口读出在服务寄存器2)相关的在服务位(每个在服务寄存器有8位,共对应IRQ 0-15)则为CPU的异常,否则为硬件中断。

  下面是WINDOWS2000根据INTEL x86处理器的定义,将IDT中的前几项注册为对应的异常处理程序(不同的操作系统对此的实现标准是不一样的,这里给出的和其它一些资料不一样是因为这是windows的具体实现):

  中断号  名字    原因    
  0x0  除法错误    1、DIV和IDIV指令除0
        2、除法结果溢出
  0x1  调试陷阱    1、EFLAG的TF位置位
        2、执行到调试寄存器(DR0-DR4)设置的断点
        3、执行INT 1指令
  0x2  NMI中断    将CPU的NMI输入引脚置位(该异常为硬件发生非屏蔽中断而保留)
  0x3  断点    执行INT 3指令
  0x4  整数溢出    执行INTO指令且OF位置位
  0x5  BOUND边界检查错误  BOUND指令比较的值在给定范围外  
  0x6  无效操作码  指令无法识别
  0x7  协处理器不可用  1、CR0的EM位置位时执行任何协处理器指令    
        2、协处理器工作时执行了环境切换  
  0x8  双重异常    处理异常时发生另一个异常
  0x9  协处理器段超限  浮点指令引用内存超过段尾
  0xA  无效任务段  任务段包含的描述符无效(windows不  
使用TSS进行环境切换,所以发生该异常说明有其它问题)
  0xB  段不存在    被引用的段被换出内存
  0xC  堆栈错误    1、被引用内存超出堆栈段限制
        2、加载入SS寄存器的描述符的present位置0
  0xD  一般保护性错误  所有其它异常处理例程无法处理的异常
  0xE  页面错误    1、访问的地址未被换入内存
        2、访问操作违反页保护规则
  0x10  协处理器出错  CR0的EM位置位时执行WAIT或ESCape指令
  0x11  对齐检查错误  对齐检查开启时(EFLAG对齐位置位)访问未对齐数据
  
  其它异常还包括获取系统启动时间服务int 0x2a、用户回调int 0x2b、系统服务int 0x2e、调试服务int 0x2d等系统用来实现自己功能的部分,都是通过异常的机制,触发方式就是执行相应的int指令。

  这里给出几个异常处理中重要的结构:

  陷阱帧TrapFrame结构(后面提到的异常帧ExceptionFrame结构其实也是一个KTRAP_FRAME结构):

  typedef struct _KTRAP_FRAME {
      ULONG  DbgEbp;    
      ULONG  DbgEip;   
      ULONG  DbgArgMark;  
      ULONG  DbgArgPointer;
      ULONG  TempSegCs;
      ULONG  TempEsp;
      ULONG  Dr0;
      ULONG  Dr1;
      ULONG  Dr2;
      ULONG  Dr3;
      ULONG  Dr6;
      ULONG  Dr7;
      ULONG  SegGs;
      ULONG  SegEs;
      ULONG  SegDs;
      ULONG  Edx;
      ULONG  Ecx;
      ULONG  Eax;
      ULONG  PreviousPreviousMode;
      PEXCEPTION_REGISTRATION_RECORD ExceptionList;
      ULONG  SegFs;
      ULONG  Edi;
      ULONG  Esi;
      ULONG  Ebx;
      ULONG  Ebp;
      ULONG  ErrCode;
      ULONG  Eip;
      ULONG  SegCs;
      ULONG  EFlags;
      ULONG  HardwareEsp;  
      ULONG  HardwareSegSs;
      ULONG  V86Es;     
      ULONG  V86Ds; 
      ULONG  V86Fs;
      ULONG  V86Gs;  
  } KTRAP_FRAME;

  环境Context结构:

  typedef struct _CONTEXT {
      ULONG ContextFlags;
      ULONG  Dr0;
      ULONG  Dr1;
      ULONG  Dr2;
      ULONG  Dr3;
      ULONG  Dr6;
      ULONG  Dr7;
      FLOATING_SAVE_AREA FloatSave;
      ULONG  SegGs;
      ULONG  SegFs;
      ULONG  SegEs;
      ULONG  SegDs;
      ULONG  Edi;
      ULONG  Esi;
      ULONG  Ebx;
      ULONG  Edx;
      ULONG  Ecx;
      ULONG  Eax;
      ULONG  Ebp;
      ULONG  Eip;
      ULONG  SegCs; 
      ULONG  EFlags;
      ULONG  Esp;
      ULONG  SegSs;
      UCHAR  ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION];
  } CONTEXT;

  异常记录ExceptionRecord结构:

  typedef struct _EXCEPTION_RECORD {
      NTSTATUS ExceptionCode;
      ULONG ExceptionFlags;
      struct _EXCEPTION_RECORD *ExceptionRecord;
      PVOID ExceptionAddress;
      ULONG NumberParameters;
      ULONG_PTR ExceptionInformatio[EXCEPTION_MAXIMUM_PARAMETERS];
    } EXCEPTION_RECORD;
 
 
  更多内容
  •  Windows XP集成安装光盘制作完全教程(下)
  •  电脑维护之Windows异常处理流程(中)
  •  电脑维护之Windows异常处理流程(下)