Concernant 0xCC
y 0xCD
en particulier, il s'agit de reliques du Intel 8088 / 8086 le jeu d'instructions du processeur dans les années 1980. 0xCC
est un cas particulier de la interruption logicielle opcode INT
0xCD
. La version spéciale à un seul octet 0xCC
permet à un programme de générer interrompre 3 .
Bien que les numéros d'interruption du logiciel soient, en principe, arbitraires, INT 3
était traditionnellement utilisé pour le arrêt du débogage o point d'arrêt fonction, une convention qui perdure à ce jour. Chaque fois qu'un débogueur est lancé, il installe un gestionnaire d'interruption pour la fonction INT 3
de telle sorte que lorsque cet opcode sera exécuté, le débogueur sera déclenché. En général, il mettra en pause la programmation en cours et affichera une invite interactive.
Normalement, le système x86 INT
L'opcode est de deux octets : 0xCD
suivi du numéro d'interruption souhaité de 0 à 255. Maintenant, bien que vous puissiez émettre 0xCD 0x03
para INT 3
Intel a décidé d'ajouter une version spéciale. 0xCC
sans octet supplémentaire, car un code d'opération ne doit comporter qu'un seul octet afin de fonctionner comme un "octet de remplissage" fiable pour la mémoire inutilisée.
L'objectif est de permettre une reprise en douceur. si le processeur saute par erreur dans une mémoire qui ne contient pas les instructions prévues . Les instructions multi-octets ne sont pas adaptées à cet objectif puisqu'un saut erroné pourrait atterrir à n'importe quel décalage d'octet possible où il faudrait continuer avec un flux d'instructions correctement formé.
Évidemment, les opcodes d'un octet fonctionnent trivialement pour cela, mais il peut aussi y avoir des exceptions bizarres : par exemple, en considérant la séquence de remplissage 0xCDCDCDCD
(également mentionné sur cette page), nous pouvons voir qu'il est assez fiable puisque, peu importe où se trouve le fichier pointeur d'instruction terres (sauf peut-être le dernier octet rempli), le CPU peut reprendre l'exécution d'un programme valide deux octets Instruction x86 CD CD
dans ce cas, pour générer l'interruption logicielle 205 (0xCD).
Plus étrange encore, alors que CD CC CD CC
est interprétable à 100% - donnant soit INT 3
o INT 204
-la séquence CC CD CC CD
est moins fiable, seulement 75 % comme indiqué, mais généralement 99,99 % lorsqu'elle est répétée comme un remplissage de la mémoire en taille réelle.
<em>Référence de l'assembleur de macros </em>, 1987
0 votes
Quand et pourquoi un système d'exploitation initialise-t-il la mémoire à 0xCD, 0xDD, etc. sur malloc/free/new/delete ?
0 votes
@Luu Vinh Phúc : Ce n'est pas le système d'exploitation, c'est le débogueur. Le "D" (comme sur 0xCD et 0xDD) est pour Debug (c'est-à-dire que malloc_dbg est ce qui est appelé via malloc comme expliqué dans msdn.microsoft.com/fr/us/library/aa270812(v=vs.60).aspx ). Je crois qu'il ajoute également des clôtures/poteaux autour des tas pour suivre les dépassements de tampon. C'est très utile pour attraper les problèmes lorsque vous avez un bug de double-delete ou multiple-free (ou même un appel possible de delete au lieu de delete[]) et des pointeurs pendants qui ont été éliminés et lorsque vous inspectez les données, c'est "0xDD" (ou lorsque le tas non initialisé montre 0xCD).
0 votes
Je n'ai pas dit que c'était l'OS. C'est l'autre demandeur qui a écrit le titre de façon incorrecte.
0 votes
Duplicata possible de Quand et pourquoi un système d'exploitation initialise-t-il la mémoire à 0xCD, 0xDD, etc. sur malloc/free/new/delete ?