【问题标题】:What is a privileged instruction?什么是特权指令?
【发布时间】:2010-09-10 12:23:24
【问题描述】:

我添加了一些可以干净编译的代码,并且刚刚收到此 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(在 Windows 2000 上的 P4 上运行)。

【问题讨论】:

    标签: c winapi debugging odbc


    【解决方案1】:

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

    常规程序在“用户模式”(Ring-3)下执行,不允许直接访问 I/O 设备等...

    正如其他人提到的,原因可能是堆栈损坏或函数指针调用混乱。

    【讨论】:

      【解决方案2】:

      这种事情通常发生在使用指向无效数据的函数指针时。 如果您的代码破坏了返回堆栈,也可能发生这种情况。有时很难追踪这类错误,因为它们通常很难重现。

      【讨论】:

        【解决方案3】:

        特权指令是仅允许在 Ring-0(即内核模式)中执行的 IA-32 指令。如果您在用户空间中遇到此问题,那么您要么得到了一个非常旧的 EXE,要么是一个损坏的二进制文件。

        【讨论】:

        • 我在大约 10 秒前使用 VC6 编译的 exe.... 但它确实包含指向 ODBC.LIB 和其他可能很旧的库的链接。此应用不是驱动程序或服务。
        【解决方案4】:

        正如我所怀疑的那样,我这样做很愚蠢。我认为由于上面消息中 cmets 中的一些线索,我以两倍的速度解决了这个问题。感谢那些人,尤其是那些指出应用程序早期覆盖堆栈的人。实际上,我在这里发现了几个答案比我标记为回答问题的帖子更有用,因为他们提示并排队我看哪里,尽管我认为它最好地总结了答案。

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

        #define MAX_NUM_TOOBAR_BUTTONS (24)

        甚至存在!

        【讨论】:

          【解决方案5】:

          我能想到的第一个可能性是,您可能正在使用一个局部数组,它位于函数声明的顶部附近。您的边界检查变得疯狂并覆盖了返回地址,它指向了一些只允许内核执行的指令。

          【讨论】:

            【解决方案6】:

            错误位置 0x00486752 对我来说似乎很小,在可执行代码通常存在的位置之前。我同意丹尼尔的观点,这对我来说似乎是一个疯狂的指针。

            【讨论】:

              【解决方案7】:

              我在 2000 年使用 Visual c++ 6.0 看到了这一点。

              调试 C++ 库在异常处理程序中调用了物理 I/O 指令。 如果我没记错的话,它会将状态转储到曾经用于 DMA 基址寄存器的 I/O 端口,我认为微软的某个人正在使用它作为调试器卡。

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

              我正在调试、回溯并阅读反汇编。处理 std::string 时出现异常,可能会在末尾进行索引。

              【讨论】:

              • 其实是VC6。但不是 C++,尽管有很多以零结尾的字符串。 (我可以使用新的编译器,但听说 VC6 实际上比 C 更快,而不是 C++)。我怀疑这是一个编译器错误......(我总是发现它是其中之一 - “我在想什么”时刻)。
              【解决方案8】:

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

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

              【讨论】:

                【解决方案9】:

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

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

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2019-04-26
                  • 2015-12-07
                  • 2018-03-26
                  • 2020-12-10
                  相关资源
                  最近更新 更多