Question

Lors de la lecture document de base ARM, je suis arrivé ce doute. Comment la CPU différencier les données lues sur le bus de données, que ce soit pour l'exécuter comme une instruction ou une donnée qu'il peut fonctionner sur?

Reportez-vous à l'extrait du document -

  

"Data pénètre dans le coeur de processeur   par le bus de données. Les données peuvent être   une instruction d'exécuter ou de données   point. "

Merci d'avance pour me éclairer! / MS

Était-ce utile?

La solution

Chaque opcode sera composé d'une instruction d'octets N, ce qui attend les octets suivants M à données (pointeurs de mémoire, etc.). Ainsi, la CPU utilise chaque opcode pour déterminer comment manyof les octets suivants sont données.

Certes, pour les anciens processeurs (par exemple les anciens types 8 bits tels que 6502 et similaires) il n'y avait pas de différence. Normalement, vous devez pointer le compteur de programme au début du programme en mémoire et que les données de référence serait d'ailleurs en mémoire, mais le programme / données ont été stockées sous forme de valeurs simples 8 bits. Le processeur lui-même ne peut pas différencier entre les deux.

Il était parfaitement possible de pointer le compteur de programme à ce qui était considéré comme des données, et en fait je me souviens d'un vieux tutoriel collège où mon professeur a fait exactement qui, et nous avons dû signaler l'erreur sur à lui. Sa réponse était « mais ses données! Il ne peut pas exécuter ça! Peut-il? », À quel point je peuplaient nos données avec opcodes valides pour prouver que, en effet, il pourrait.

Autres conseils

La réponse est simple - il ne fonctionne pas. instructions de code de la machine ne sont que des nombres binaires, comme les données. réponse plus compliquée - votre processeur peut (ou non) assurer une segmentation de la mémoire, ce qui signifie que la tentative d'exécution de ce qui a été spécifié comme données provoque un piège quelconque. Ceci est l'un des sens d'une « erreur de segmentation. » - le processeur essayé d'exécuter quelque chose qui n'a pas été étiqueté comme étant un code exécutable

La conception originale ARM avait un pipeline en trois étapes pour exécuter des instructions:

  1. fetch l'instruction dans la CPU
  2. DÉCODER l'instruction pour configurer la CPU pour l'exécution
  3. exécuter l'instruction.

logique interne de la CPU assure qu'il sait si elle est la récupération des données à l'étape 1 (à savoir une extraction d'instruction) ou dans l'étape 3 (à savoir une extraction de données en raison d'une instruction « chargement »).

Les processeurs modernes ARM ont un bus séparé pour aller chercher des instructions (de sorte que le pipeline ne bloque pas lors de l'extraction des données), et un pipeline plus long (pour permettre des vitesses d'horloge plus rapides), mais l'idée générale est toujours la même.

Chaque lue par le processeur est connu pour être une extraction de données ou une instruction d'extraction. Tous les processeurs anciens et nouveaux connaissent leur instruction va chercher de va chercher des données. De l'extérieur, vous pouvez ou ne pas être en mesure de dire, sauf généralement pas pour les processeurs d'architecture harvard bien sûr, que l'ARM est pas. Je travaille avec le MPCore (ARM11) ces derniers temps et il y a bits sur l'interface externe que vous dire un peu plus sur ce que lu nature de celui-ci est, la plupart du temps de brancher un cache externe, moissonneuse-batteuse avec la connaissance de si vous avez la MMU et le cache L1 et vous pouvez dire des données de l'instruction, mais qui est l'exception à la règle. Du point de vue du bus mémoire, il est seulement des bits de données que vous ne connaissez pas les données de l'instruction, mais la logique qui a initié ce cycle de mémoire et attend le résultat savait avant de commencer le cycle quel genre de le chercher et ce qu'il va faire avec ces données quand il l'obtient.

Je pense que à l'endroit où les données sont stockées dans le programme et le support OS pour informer l'unité centrale de traitement si elle est un code ou des données.

Tout le code est placé dans les différents segments de l'image (ainsi que des données statiques comme des chaînes de caractères constants) par rapport au stockage des variables. Le système d'exploitation (et l'unité de gestion de mémoire) ont besoin de savoir parce qu'ils peuvent échanger du code de mémoire en supprimant simplement et rechargeant à partir du fichier de disque d'origine (au moins, c'est Windows, il fait).

Alors, je pense que la CPU « sait » si la mémoire est données ou un code. Sans doute les CPUs de pipeling modernes, nous avons également des instructions pour lire cette mémoire différemment pour aider l'unité centrale de traitement est le traitement aussi vite que possible (par exemple, le code ne peut pas être mis en mémoire cache, les données seront toujours accessible au hasard plutôt que dans un cours d'eau)

Son toujours possible de pointer votre compteur de programme à des données, mais le système d'exploitation peut dire la CPU pour empêcher cela - voir bit NX et les paramètres « Data Execution Protection » de Windows (panneau de commande du système)

Alors, je pense que la CPU « sait » si la mémoire est données ou un code. Sans doute les CPUs de pipeling modernes, nous avons également des instructions pour lire cette mémoire différemment pour aider l'unité centrale de traitement est le traitement aussi vite que possible (par exemple, le code ne peut pas être mis en mémoire cache, les données seront toujours accessible au hasard plutôt que dans un cours d'eau)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top