什么是特权指令?

什么是特权指令?

问题描述:

我加入了一些代码,编译干净,刚刚收到此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,其DEBUG打开(在Windows上的P4上运行,在  2000上)。

要回答这个问题,特权指令是一个只能在“supervisor”(或Ring-0)模式下执行的处理器操作码(汇编指令)。 这些类型的指令通常用于从Windows内核访问I/O设备和受保护的数据结构。

常规程序来执行在“用户模式”(环3),不允许对I/O装置等直接访问...

正如其他提到的,原因可能是一个已损坏的堆或弄乱函数指针调用。

我在2000年

调试C++库不得不在它的物理I/O指令调用,在异常处理程序看到这个用Visual C++ 6.0。 如果我没有记错的话,它会将状态转储到一个曾经用于DMA基址寄存器的I/O端口,我假定有人在微软用于调试卡。

查找可能导致诊断代码运行的潜在错误。

我在调试,回溯并读取反汇编。在处理std::string时,这是一个例外,也许索引结束。

+0

它实际上是VC6。但不是C++,尽管大量的零终止字符串。 (我可以使用新的编译器,但已经听说过VC6实际上比C更快,而不是C++)。我怀疑这是一个编译器错误,尽管......(我总是发现它就是其中之一 - “我在想什么”时刻)。 – 2008-09-18 03:08:13

这种事情通常发生在使用指向无效数据的函数指针时。 如果您的代码会损坏您的返回堆栈,也会发生这种情况。追踪这些错误有时会非常棘手,因为它们通常很难再现。

我能想到的第一种可能性是,您可能正在使用本地数组,并且它靠近函数声明的顶部。你的边界检查疯了,覆盖返回地址,它指向一些只允许内核执行的指令。

特权指令是IA-32指令,只允许在Ring-0(即内核模式)中执行。如果你在用户空间中击中了这个,你要么有一个非常旧的EXE,要么是一个损坏的二进制文件。

+0

大约10秒前我使用VC6编译的exe文件......但它确实包含了ODBC.LIB和其他可能相当老的libs的链接。此应用程序不是驱动程序或服务。 – 2008-09-18 03:10:27

错误位置0x00486752对于我来说似乎真的很小,在可执行代码通常存在的地方。我同意丹尼尔的观点,它看起来像是一个狂野的指针。

正如我怀疑这是我做的事情愚蠢。我想我解决这个问题的速度是上述消息中的一些线索。感谢那些特别指出应用程序早期覆盖堆栈的人。实际上,我在这里找到了几个答案,这些答案更有用,我标记为回答问题的帖子,因为他们提出了问题并排队等待我去哪里寻找答案,尽管我认为最好总结答案。

事实证明,我刚刚添加了一个按钮,超过了一个数组的最大大小,其中包含一些工具栏按钮信息(位于堆栈中)。我忘记了

 
#define MAX_NUM_TOOBAR_BUTTONS (24) 

甚至存在!

过去15年制造的大多数处理器的CPU都有一些非常强大的特殊指令。这些特权指令保留用于操作系统内核应用程序,并且不能由用户编写的程序使用。

这限制了用户编写的程序可能对系统造成的损害,并减少了系统实际崩溃的次数。

在内核模式下执行时,操作系统可以不受限制地访问内核和用户程序的内存。

基本和限制寄存器的加载指令是特权指令。