Qu'est-ce qu'une instruction privilégiée?

j'ai ajouté du code qui se compile proprement et je viens de recevoir cette erreur Windows:

---------------------------
(MonTel Administrator) 2.12.7: MtAdmin.exe - Application Error
---------------------------
The exception Privileged instruction.

 (0xc0000096) occurred in the application at location 0x00486752.

je suis sur le point d'aller sur une chasse aux insectes, et je m'attends à ce que ce soit quelque chose de stupide que j'ai fait qui arrive juste à produire ce message. Le code se compile proprement sans aucune erreur ni avertissement. La taille du fichier EXE est passée à 1,454,132 octets et inclut des liens vers ODCS.lib, mais il est par ailleurs pur C Pour L'API Win32, avec DEBUG on (tournant sur un P4 sur Windows 2000).

22
demandé sur Peter Mortensen 2008-09-18 06:56:25

9 réponses

pour répondre à la question, une instruction privilégiée est un code Op du processeur (instruction assembleur) qui ne peut être exécuté qu'en mode "superviseur" (ou Ring-0). Ces types d'instructions ont tendance à être utilisés pour accéder aux périphériques D'E/S et aux structures de données protégées du noyau windows.

les programmes réguliers s'exécutent en "mode utilisateur" (Ring-3) qui interdit l'accès direct aux périphériques D'E/S, etc...

comme d'autres l'ont mentionné, la cause est probablement une pile corrompue ou une erreur pointeur de fonction d'appel.

30
répondu Benoit 2013-07-14 19:36:02

ce genre de chose se produit habituellement quand on utilise des pointeurs de fonction qui pointent vers des données invalides. Cela peut aussi se produire si vous avez du code qui détruit votre pile de retour. Il peut parfois être assez difficile de suivre ces sortes de bogues vers le bas parce qu'ils sont généralement difficiles à reproduire.

7
répondu Daniel 2008-09-18 03:03:46

une instruction privilégiée est une instruction IA-32 qui n'est autorisée qu'à être exécutée en Ring-0 (c'est-à-dire en mode noyau). Si vous touchez ça dans l'espace utilisateur, vous avez soit un EXE très ancien, soit un binaire corrompu.

7
répondu Paul Betts 2008-09-18 03:04:22

la première Probabilité à laquelle je peux penser est, vous pouvez utiliser un tableau local et il est proche du haut de la déclaration de fonction. Votre vérification des limites est devenue insensée et écrase l'adresse de retour et elle pointe vers une instruction que seul le noyau est autorisé à exécuter.

4
répondu artificialidiot 2008-09-18 03:04:03

comme je m'en doutais c'était quelque chose de stupide que j'ai fait. Je pense que j'ai résolu cela deux fois plus vite en raison de certains des indices dans les commentaires dans les messages ci-dessus. Merci à ceux en particulier ceux qui ont pointé quelque chose au début de l'application écrasant la pile. En fait, j'ai trouvé plusieurs réponses ici plus utile que le post que j'ai marqué comme répondant à la question comme ils m'ont clued et la file d'attente quant à où regarder, bien que je pense qu'il résume le mieux la réponse.

Comme il s'est avéré que j'avais juste ajouté un bouton qui est allé au-dessus de la taille maximale d'un tableau contenant quelques informations de bouton de barre d'outils (qui était sur la pile). J'avais oublié que

#define MAX_NUM_TOOBAR_BUTTONS  (24)

même l'existence!

4
répondu David L Morris 2008-09-18 03:54:30

l'emplacement d'erreur 0x00486752 me semble vraiment petit, avant où le code exécutable vit habituellement. Je suis D'accord avec Daniel, ça ressemble à un indicateur sauvage pour moi.

2
répondu Jeremy 2008-09-18 03:10:28

J'ai vu ça avec Visual C++ 6.0 en l'an 2000.

la bibliothèque de débogage C++ contenait des appels à des instructions d'e/s physiques, dans un gestionnaire d'exception. Si je me souviens bien, c'était un transfert de statut vers un port d'e/s qui était utilisé pour les registres de base DMA, que je suppose que Quelqu'un à Microsoft utilisait pour une carte de débogueur.

recherchez une condition d'erreur qui pourrait être latente causant le code de diagnostic à exécuter.

j'étais en train de déboguer, de retracer et de lire dissassembly. C'était une exception pendant le traitement std::string, peut-être indexer hors de la fin.

2
répondu Tim Williscroft 2011-10-19 19:47:22

le processeur de la plupart des processeurs fabriqués au cours des 15 dernières années a des instructions spéciales qui sont très puissantes. Ces instructions privilégiées sont conservées pour les applications du noyau du système d'exploitation et ne peuvent pas être utilisées par les programmes écrits par l'utilisateur.

cela restreint les dommages qu'un programme écrit par l'utilisateur peut infliger au système et réduit le nombre de fois où le système se bloque.

2
répondu Maliha Atteeq 2011-10-19 19:51:37

lors de l'exécution en mode noyau, le système d'exploitation a un accès illimité à la fois au noyau et à la mémoire du programme utilisateur.

les instructions de chargement pour les registres de base et limit sont des instructions privilégiées.

2
répondu Bushara 2011-10-19 19:52:32