上网出现20种错误信息的分析(4) 保留中断号。 我想很多人都对异常代码代表的意义很感兴趣,然而,这些信息不太容易被初学者看懂, 只能满足一下你的好奇心,呵呵。 00: Divide Fault (除法错误) 此异常发生在企图让CPU做除数为0的除法运算,或者除法运算结果溢出时。 通常这个错误不会导致蓝屏,但是windows会显示“该程序执行了非法操作...”这样的 对话框。 02: NMI interrupt (不可屏蔽中断) 2号中断被保留作为硬件的不可屏蔽中断。不可屏蔽中断具有最高优先权,它通常用于 解决系统中最紧急的情况。2号中断不会被异常机制截获。 04: Overflow trap (溢出) 当CPU执行一条INTO指令时,如果0F位被置为1,则会发生Overflow trap异常 05: Bounds Check Fault (边界检查错误) BOUND指令比较数组的下标是否越界,如果是,发生边界检查错误。 06: Invalid Opcode fault (无效指令码错误) 这个错误产生的原因有: 1) CPU试图对一个同任何合法的指令都不对应的bit pattern进行解码(需要有计算机体系 结构知识才能看懂这句话,呵呵。我不知道该怎么用中文表达“bit pattern”) 2) CPU试图执行一条带有无效操作数的指令 3) CPU试图在虚拟8086模式下执行保护模式下的指令 4) CPU试图在一条不能被锁的指令前执行LOCK前缀 07: Coprocessor not available fault (协处理器不可用错误) 当系统中不存在数学协处理器,并且CR0寄存器的EM位为1,代表现在正在使用数学协处理器 仿真时,如果执行浮点运算指令,则产生7号中断。 当数学协处理器正在工作时如果发生任务切换,该中断也会被引发,以通知CPU保存数学 协处理器的工作。 08: Double Fault (双重错误) 处理一个异常时可能会引发另一个异常。在这种情况下产生双重错误。 09: Coprocessor Segment Overrun (协处理器段超出) 当一个浮点运算指令导致对内存中超过段边界的区域进行读写的情况时,发生此错误。 如果开始时浮点操作数就在段边界以外,则GPF错误(一般保护错误)将发生。 0A: Invalid Task State Segment Fault (无效任务状态段错误) 由于任务状态段中包含很多描述符,很多情况都会导致这个错误。 通常,CPU将从任务状态段中收集足够的信息,以便确定究竟是哪个地方出了娄子。 0B: Not Present Fault (不存在错误,段不存在错误) “不存在”中断使得操作系统可以通过分段机制实现虚拟存储器。当一个段被标记为“不 存在”时,该段被“交换”到磁盘交换文件中。当程序需要访问一个在磁盘交换文件中的 段时,引发0B中断。 0C: Stack Fault (堆栈错误) 当一条指令引用了超出堆栈段界限的存储空间时,发生堆栈错误。 如果操作系统支持“向下扩展的段”,也就是说堆栈的大小可以被增加,则会缓解这样的 问题。 而如果试图用一个无效的描述符加载一个堆栈段将会导致一般保护错误。 0D: General Protection Fault (呵呵,这个就是臭名远扬的一般保护错误啦) 任何未被列在本文中的其他错误,都被当成一般保护错误引发。 通常,一般保护错误代表程序已经崩溃,需要立即被终止。 0E: Page Fault (页错误) 正常情况下,这是采用页式存储管理(实现虚拟存储器的一种方法)的操作系统处理缺页 中断的信号。 如果某个操作违反了页的保护规则,比如从虚拟存储器中取页失败、取数据失败、指令违反