Что такое привилегированное обучение?
Я добавил код, который компилируется чисто и только что получил эту ошибку 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
, но в противном случае это чистый C для Win32 API, с DEBUG (работает на P4 в Windows 2000).
Ответы
Ответ 1
Чтобы ответить на вопрос, привилегированная инструкция является операционным кодом процессора (инструкция ассемблера), который может быть выполнен только в режиме "супервизор" (или Ring-0).
Эти типы инструкций, как правило, используются для доступа к устройствам ввода/вывода и защищенным структурам данных из ядра Windows.
Обычные программы выполняются в "пользовательском режиме" (Ring-3), который запрещает прямой доступ к устройствам ввода-вывода и т.д.
Как упоминалось выше, причиной является, вероятно, поврежденный стек или перекошенный вызов указателя функции.
Ответ 2
Обычно это происходит при использовании указателей функций, указывающих на недопустимые данные.
Это также может произойти, если у вас есть код, который разбивает ваш стек возврата. Иногда бывает довольно сложно отслеживать такие ошибки, потому что их обычно трудно воспроизвести.
Ответ 3
Привилегированная инструкция - это инструкция IA-32, которая разрешена только в Ring-0 (то есть в режиме ядра). Если вы используете это в пользовательском пространстве, у вас есть действительно старый EXE или поврежденный двоичный файл.
Ответ 4
Первой вероятностью, о которой я могу думать, может быть использование локального массива, и оно находится в верхней части объявления функции. Ваша проверка границ сошла с ума и перезаписала обратный адрес, и он указывает на некоторую инструкцию, что разрешено только ядро.
Ответ 5
Как я и подозревал, это было что-то глупое, что я сделал. Я думаю, что я решил это в два раза быстрее из-за некоторых подсказок в комментариях в вышеприведенных сообщениях. Благодаря тем, особенно тем, кто указал на что-то в начале приложения, переписывая стек. Я действительно нашел несколько ответов здесь более полезными, поскольку сообщение, которое я обозначил, отвечая на вопрос, когда они указывали, поставил меня в очередь на то, где искать, хотя я думаю, что это лучше всего подводит итог ответу.
Как оказалось, я только что добавил кнопку, которая переместила максимальный размер массива, содержащего информацию о кнопке панели инструментов (которая была в стеке). Я забыл, что
#define MAX_NUM_TOOBAR_BUTTONS (24)
даже существовало!
Ответ 6
Я видел это с Visual С++ 6.0 в 2000 году.
В библиотеке debug С++ были вызовы для физических инструкций ввода-вывода в обработчике исключений.
Если я правильно помню, это был статус сброса на порт ввода-вывода, который использовался для базовых регистров DMA, которые, как я полагаю, использовали в Microsoft для отладчика.
Посмотрите на какое-то условие ошибки, которое может быть скрытым, в результате чего запускается диагностический код.
Я отлаживал, возвращал назад и читал разборку. Это было исключение при обработке std::string
, возможно, индексирование с конца.
Ответ 7
Место ошибки 0x00486752 кажется мне очень маленьким, прежде чем обычно исполняется исполняемый код. Я согласен с Даниэлем, это выглядит как дикий указатель на меня.
Ответ 8
Процессор большинства процессоров, выпущенных за последние 15 лет, содержит некоторые специальные инструкции, которые очень мощные. Эти привилегированные инструкции хранятся для приложений ядра операционной системы и не могут использоваться пользовательскими программами.
Это ограничивает ущерб, который пользовательская программа может нанести системе, и сокращает количество сбоев системы.
Ответ 9
При выполнении в режиме ядра операционная система имеет неограниченный доступ как к ядру, так и к памяти пользовательской программы.
Инструкции по загрузке для базового и предельного регистров являются привилегированными инструкциями.