2010-12-14 24 views

Répondre

0

Lorsque vous démarrez une application, l'eip (compteur de programme) est défini sur l'emplacement des données de texte de votre programme, les données de texte correspondent à votre code (0..1). De là, il commence à exécuter des instructions à partir de l'adresse qui est mis sur eip. Les instructions sont définies sur une ROM proche du processeur (ou du cache) si, par hasard, le processeur essaye d'exécuter quelque chose qui n'est pas une instruction, il lance une exception (interruption à ce niveau). Comment il sait si c'est l'instruction ou non, imaginez que pour chaque instruction qui va chercher il vérifie le rom comme et hashtable pour voir si c'est une instruction valide.

Ceci est une approche très simple du problème car beaucoup de choses se produisent XDD.

3

Le processeur ne fait que ce que vous lui dites de faire. Comme vous l'avez noté, le processeur ne peut pas faire la différence entre "données" et "code" dans la mémoire: c'est juste une séquence d'octets. C'est ce que vous lui dites de faire avec ces octets qui définit comment il est traité.

Lorsqu'un programme est compilé, le fichier exécutable généré contient des informations indiquant quelles parties sont du code et quelles parties sont des données. Lorsqu'un programme est exécuté, le système d'exploitation charge le code et les données dans différentes parties de la mémoire, puis demande au processeur de commencer à exécuter le code au point d'entrée du programme. À partir de là, le processeur récupère la première instruction, l'exécute et passe à l'instruction suivante.

Tout cela est très simplifié, bien sûr, mais je pense que vous avez l'idée.

Dans les anciens processeurs et les systèmes d'exploitation plus anciens, rien ne vous empêche de dire au processeur de commencer à exécuter les instructions situées au milieu d'un segment de données. Ou, en fait, de modifier "données" au milieu d'un segment de code - ce qui rend le code auto-modifiable. Les nouveaux processeurs et systèmes d'exploitation ont généralement une forme de prévention de l'exécution des données et des verrous pour empêcher la modification du code. Sinon, le code auto-modifiable peut devenir un énorme risque de sécurité. La réponse courte: le processeur traite le code comme un code parce que vous le lui dites. Sinon, tout est juste en mémoire.

2

Les différents registres aident le processeur à distinguer les différents segments de la mémoire dans un processus s'exécutant sur un ordinateur. Lorsqu'un programme démarre, le registre de segment de code (cs) et le pointeur d'instruction (ip/eip/rip) sont configurés pour pointer vers l'emplacement du code, tandis que le registre de segment de données (DS) et l'un des registres d'usage général) sont utilisés pour pointer dans le segment de données. Eh bien, c'est surtout l'architecture Intel x86, mais en général, la plupart des architectures ont des registres pour délimiter la région de code de la région de données, ainsi que le segment de la pile. Grâce à ces registres, le CPU "sait" ou est capable de distinguer entre l'adresse de code