汇编语言无效指令错误概述

问题:cmpxchg8b 指令比较一个8字节值edx和EAX带有8字节值内存( 目的地操作数)。 只有有效目标操作数用于此指令是内存 操作数。 如果目标操作数是一个寄存器处理器应产生一个 无效OpCode例外,执行的指令cmpxchg8b应当停止和 处理器应该执行无效OpCode异常处理程序。 此错误发生是 锁定前缀为使用cmpxchg8b指令与一个(无效)寄存器目的地 操作数。 在这种情况下,处理器可能无法启动执行无效OpCode 异常处理程序,因为总线已锁定。 这将导致系统挂起。

提示:如果(无效)寄存器目的地 操作使用cmpxchg8b指令和锁定前缀,系统可能挂起。 没有内存数据已损坏,用户可以执行系统重置以返回到正常 操作。 请注意,特定无效代码序列必要此错误 发生通常不能被生成,该课程的编程也不这样的序列 可可由此商业软件。

此错误仅适用于奔腾 处理器、奔腾处理器与MMX技术、奔腾OverDrive处理器 和奔腾OverDrive处理器带有MMX技术。 奔腾Pro处理器, 奔腾II处理器和i486及更早版本处理器不受影响。

变通办法:有两种变通方法此错误以 保护模式操作系统。 变通办法二者生成一个页面错误当无效 OpCode例外情况。 在以上两例中,页错误将维修前无效 OpCode例外,从而防止锁定状态的发生。 实施 细节将有所不同取决于操作系统。 使用以下方法之一:
第一部分的该解决办法集的第一个7条目(0-6)中断 描述信息表(IDT)在非写页。 当无效OpCode异常 (异常6)出现的原因是锁定cmpxchg8b指令带无效注册 目的地,然后才),处理器将生成一个页面错误如果没有有 写访问该页面包含条目6的IDT。 的第二部分该解决办法 修改页面错误处理程序认识和正确地调度"无效OpCode 例外情况,现在布线通过页面错误处理程序。

部件I、IDT页面访问

标记页面包含的第一个七个条目(0-6)的IDT为只读通过 设置位1的页面表条目为零。 也可以设置cr0.wp(16位)为1。 现在,当" 无效OpCode异常发生锁定cmpxchg8b指令,处理器将 会触发页面错误由于它没有写访问该页面包含条目6的 IDT。 此页面错误阻止了总线锁定状态并给操作系统完全控制 过程"无效操作异常。 请注意,例外6是 无效OpCode例外,因此与此图式的OS有完全控制的任何程序 执行一个无效cmpxchg8b指令。
可选:如果更新条目7-255的IDT发生在课程正常 操作,页面错误应避免在写入这些IDT条目。 这些页面错误 可避免对齐IDT跨越一个4KB页面边界(例如,可在第一个七个 条目(0-6)的IDT在第一个只读"页和"剩余的条目在 读/写页。

第II、页面错误 处理程序修改

修改寻呼容处理程序来计算哪种异常导致该页面错误使用 容地址以cr2。 如果错误代码堆栈上表示产生异常 从震铃0和如果地址对应于无效OpCode例外,然后弹出的 错误代码关闭堆栈和跳转到"无效OpCode异常处理程序。 否则 继续正常页面错误处理程序。

该解决办法有两部分。 首先,中断描述信息表(IDT)对齐 (例如,任何无效OpCode异常会导致页面错误(由于页不 存在)。 其次,页面错误处理程序日期认识和正确地调度 "无效OpCode异常和其他一些例外情况,现在布线通过 页面错误处理程序。

部件I、IDT校准:

对齐中断描述信息表(IDT)这样的,其跨越4KB页面边界, 把第一项启动56字节来自最终的第一个4KB"页。 这将 该第一个七个条目(0-6)在第一个4KB"页和剩余的条目在 第二个页面。
该页面包含的头7条目IDT不能有映射在OS 页面表。 这将导致任何例外0-6生成一份页不存在故障。 一个 页面错误阻止了总线锁定状态并给操作系统完全控制过程 这些异常。 请注意,例外6是无效OpCode例外,因此 与此图式的OS有完全控制的任何程序执行一个无效cmpxchg8b 指令。

第II、页面错误处理程序修改:

识别访问指向的第一页IDT通过测试的容地址cr2中。 页面不存在故障在其他地址可处理正常。
页不存在故障第一页上的IDT,操作系统必须识别和 发送异常造成该页面不存在故障。 继续之前,测试 故障地址以cr2以确定其是否被在地址范围相应 例外情况0-6。
计算哪种异常导致该页不存在故障从容地址 cr2中。
取决于操作系统,某些权限级别检查可能会要求,以及 调整中断堆栈。
跳转到正常处理程序为适当异常。

两个变通办法仅应上实现英特尔处理器返回family=5 通过CPUID指令。