Что такое привилегированная команда?

26
задан Peter Mortensen 19 October 2011 в 19:45
поделиться

8 ответов

Для ответа на вопрос привилегированная команда является кодом операции процессора (ассемблерная инструкция), который может только быть выполнен в "супервизоре" (или Кольцо 0) режим. Эти типы инструкций имеют тенденцию привыкнуть к устройствам ввода-вывода доступа и защищенным структурам данных от ядра окон.

Обычные программы выполняются в "непривилегированном режиме" (Кольцо 3), который запрещает прямой доступ к устройствам ввода-вывода, и т.д.

Как упомянутые другие, причиной является, вероятно, поврежденный стек или испорченный вызов указателя функции.

34
ответ дан Ana Betts 28 November 2019 в 06:36
поделиться

Такого рода вещи обычно происходят при использовании указателей на функции, которые указывают на недопустимые данные. Это также может произойти, если у вас есть код, который очищает ваш стек возврата. Иногда бывает довольно сложно отследить подобные ошибки, потому что их обычно трудно воспроизвести.

7
ответ дан Daniel 28 November 2019 в 06:36
поделиться

Привилегированная команда является инструкцией IA-32, которой только позволяют быть выполненной в Кольце 0 (т.е. привилегированный режим). При ударе этого в пространстве пользователя Вы или получили действительно старый EXE или поврежденный двоичный файл.

7
ответ дан Ana Betts 28 November 2019 в 06:36
поделиться

Первая вероятность, о которой я могу подумать, это то, что вы можете использовать локальный массив, и он находится в верхней части объявления функции. Ваша проверка границ сошла с ума и перезаписывает адрес возврата, и он указывает на некоторую инструкцию, которую может выполнять только ядро.

4
ответ дан artificialidiot 28 November 2019 в 06:36
поделиться

Как я подозревал, это было что-то глупое, что я сделал. Я думаю, что решил это вдвое более быстрое из-за некоторых подсказок в комментариях в сообщениях выше. Благодаря тем особенно те, кто указал на что-то рано в приложении, перезаписывающем стек. Я на самом деле нашел несколько ответов здесь более полезными, который сообщение я отметил как ответ на вопрос как они хорошо осведомленный и поставил меня в очередь как, туда, где посмотреть, хотя я думаю, что это лучше всего подводит итог ответа.

Как оказалось, я только что добавил кнопку, которая пробежалась через максимальный размер массива, содержащего некоторую информацию кнопки на панели инструментов (который был на стеке). Я забыл, что

#define MAX_NUM_TOOBAR_BUTTONS  (24)

даже существовал!

4
ответ дан David L Morris 28 November 2019 в 06:36
поделиться

Местоположение ошибки 0x00486752 кажется мне очень маленьким, до того места, где обычно живет исполняемый код. Я согласен с Даниэлем, это выглядит как дикий указатель на меня.

2
ответ дан Jeremy 28 November 2019 в 06:36
поделиться

Я видел это с Visual C++ 6.0 в 2000 году.

библиотека C++ отладки имела вызовы к физическим инструкциям по вводу-выводу в ней в обработчике исключений. Если я помню правильно, это выводило состояние к порту I/O, который раньше был для базовых регистров DMA, которые я предполагаю, что кто-то в Microsoft использовал для карты отладчика.

Ищут некоторое состояние ошибки, которое могло бы быть скрытым кодом диагностики порождения для выполнения.

я отлаживал, отследил в обратном порядке, и считайте дизассемблирование. Это было исключение при обработке std::string, возможно, индексации от конца.

2
ответ дан Peter Mortensen 28 November 2019 в 06:36
поделиться

ЦП большинства процессоров, изготовленных за последние 15 лет, имеют несколько специальных инструкций, которые являются очень мощными. Эти привилегированные инструкции сохраняются для приложений ядра операционной системы и не могут использоваться пользовательскими программами.

Это ограничивает ущерб, который может нанести написанная пользователем программа системе, и сокращает количество аварийных сбоев системы.

2
ответ дан Peter Mortensen 28 November 2019 в 06:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: