什么是特权指令?
我添加了一些可以干净编译的代码,并且刚刚收到此Windows错误:
--------------------------- (MonTel Administrator) 2.12.7: MtAdmin.exe - Application Error --------------------------- The exception Privileged instruction. (0xc0000096) occurred in the application at location 0x00486752.
我将继续进行错误查找,并且期望这是我所做的一些愚蠢的事情,而这恰好会产生此消息。代码可以干净地编译,没有错误或者警告。 EXE文件的大小增长到1,454,132字节,并包含指向ODCS.lib的链接,但它是Win32 API的纯C语言,并带有DEBUG(在Windows2000上的P4上运行)。
解决方案
我在2000年用Visual c ++ 6.0看到了这一点。
调试C ++库在异常处理程序中具有对物理I / O指令的调用。
如果我没记错的话,它是将状态转储到曾经用于DMA基址寄存器的I / O端口,我假设Microsoft的某人正在将其用于调试卡。
查找可能导致诊断代码运行的潜在错误情况。
我正在调试,回溯并阅读了反汇编。处理std :: string
时是一个例外,可能是从结尾索引。
当使用指向无效数据的函数指针时,通常会发生这种情况。
如果我们有代码破坏了返回堆栈,也可能发生这种情况。跟踪这些错误有时有时非常棘手,因为它们通常很难重现。
我想到的第一个可能性是,我们可能正在使用局部数组,并且该数组位于函数声明的顶部附近。边界检查变得疯狂,并覆盖了返回地址,它指向仅允许内核执行的某些指令。
特权指令是IA-32指令,仅允许在Ring-0(即内核模式)下执行。如果在用户空间中遇到此问题,则说明EXE确实很旧,或者二进制文件已损坏。
对于我而言,错误位置0x00486752似乎很小,通常位于可执行代码所在的位置。我同意丹尼尔(Daniel)的观点,这似乎是对我的疯狂指示。
为了回答这个问题,特权指令是处理器操作码(汇编程序指令),只能在"管理员"(或者Ring-0)模式下执行。
这些类型的指令通常用于从Windows内核访问I / O设备和受保护的数据结构。
常规程序在"用户模式"(Ring-3)中执行,不允许直接访问I / O设备等。
正如其他人提到的,原因可能是堆栈损坏或者函数指针调用混乱。
正如我怀疑的那样,我做的事很愚蠢。我想我解决这个问题的速度快了两倍,这是因为上面消息中的注释中有一些线索。特别感谢那些在应用程序早期指出某些内容的人,它覆盖了堆栈。实际上,我发现这里有几个答案更有用,因为我将帖子标记为回答问题,因为他们暗示并把我列在哪里,尽管我认为这是总结答案的最佳方法。
事实证明,我刚刚添加了一个按钮,该按钮超过了包含一些工具栏按钮信息(在堆栈上)的数组的最大大小。我忘记了
#define MAX_NUM_TOOBAR_BUTTONS (24)
甚至存在!
最近15年制造的大多数处理器的CPU都有一些非常强大的特殊指令。这些特权指令是为操作系统内核应用程序保留的,不能由用户编写的程序使用。
这限制了用户编写的程序可能对系统造成的损害,并减少了系统实际崩溃的次数。
在内核模式下执行时,操作系统可以不受限制地访问内核和用户程序的内存。
基本寄存器和限制寄存器的加载指令是特权指令。