Comment les instructions sont différenciées des données?
Lors de la lecture de BRAS document de base, j'ai eu ce doute. Comment le CPU différencier la lecture des données du bus de données, que ce soit pour exécuter une instruction ou à titre de données qu'il peut fonctionner sur?
Se référer à l'extrait du document -
"Données entre le processeur core
à travers le bus de Données. Les données peuvent être
une instruction à exécuter ou de données
point."
Merci d'avance pour m'éclairer!
/MS
source d'informationauteur MS.
Vous devez vous connecter pour publier un commentaire.
Chaque opcode sera composé d'une instruction de N octets, puis attend de l'après M octets de données (mémoire de pointeurs, etc.). Ainsi, le PROCESSEUR utilise chaque opcode pour déterminer comment manyof la suite d'octets de données.
Certainement pour les vieux processeurs (comme les vieux 8 bits type comme la 6502), il n'y a pas de différenciation. Vous le feriez normalement le compteur de programme pour le début du programme en mémoire et qui permettrait de données de référence à partir de quelque part d'autre dans la mémoire, mais le programme/données ont été stockées en tant que simple 8-bits. Le processeur lui-même ne pouvait 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 ancien collège tutoriel où mon professeur n'a exactementet nous avons eu pour point de l'erreur vers lui. Sa réponse a été "mais c'est de données! Il ne peut pas l'exécuter! Peut-il?", à quel point je peuplé nos données valides opcodes de prouver que, en effet, c'est possible.
Réponse Simple - il n'a pas. Le code Machine des instructions sont juste des nombres binaires, comme le sont les données. Plus compliqué de répondre à votre processeur peut (ou non) de fournir la segmentation de la mémoire, ce qui signifie que la tentative d'exécution de ce qui a été spécifié que les données provoque un piège quelconque. C'est l'un des sens d'un "segmentation fault" - le processeur essayé d'exécuter quelque chose qui n'a pas été étiqueté comme étant du code exécutable.
Chaque lu par le processeur est connue pour être une extraction de données ou d'une instruction fetch. Tous les processeurs de vieux et de nouveaux savoir leur instruction extractions de données récupère. De l'extérieur, vous peut ou peut ne pas être en mesure de dire, généralement pas, sauf pour harvard architecture processeurs de cours, dont le BRAS n'est pas. J'ai travaillé avec le mpcore (ARM11) dernièrement et il y a des morceaux sur l'interface externe que vous raconter un peu ce genre de lecture c'est, pour la plupart raccorder un cache externe, combiner qu'avec la connaissance de si vous avez le mmu et le cache L1 et vous pouvez dire les données de l'enseignement, mais c'est l'exception à la règle. À partir d'un bus mémoire de point de vue, il est juste de bits de données, vous ne savez pas de données de l'enseignement, mais la logique qui a initié cette mémoire du cycle et est en attente pour le résultat savais avant de commencer le cycle de ce type d'extraction, il était et ce qu'il va faire avec ces données lorsqu'il l'obtient.
L'original de la conception du BRAS avait trois étages de pipeline pour l'exécution des instructions:
La CPU logique interne s'assure qu'il sait si c'est de l'extraction de données à l'étape 1 (c'est à dire une instruction fetch), ou à l'étape 3 (c'est à dire une extraction de données due à une "charge" de l'enseignement).
Moderne processeurs ARM ont un bus pour aller chercher des instructions (de sorte que le pipeline n'a pas de décrochage lors de l'extraction de données), et un plus long pipeline (permettant d'accélérer les vitesses d'horloge), mais l'idée générale est toujours la même.
Je pense que sa là où les données sont stockées dans le programme et le support de l'OS pour les informer de la CPU si c'est du code ou des données.
Tout le code est placé dans le segment différent de l'image (avec des données statiques comme les constantes chaînes de caractères) par rapport à un stockage pour les variables. Le système d'exploitation (et de l'unité de gestion mémoire) besoin de le savoir, car ils peuvent échanger du code à partir de la mémoire de simplement le jeter et de le recharger à partir du disque d'origine du fichier (au moins c'est comment Windows).
Donc, je pense que le PROCESSEUR sait si la mémoire est de données ou de code. Nul doute que le moderne pipeling Processeurs, nous avons maintenant également des instructions pour lire ce mémoire différemment pour aider le CPU est en cours de traitement aussi vite que possible (par exemple, le code ne peut pas être mis en cache, les données seront toujours accessibles de manière aléatoire plutôt que dans un cours d'eau)
Il est toujours possible de faire pointer votre compteur de programme, à des données, mais le système d'exploitation peut dire le CPU pour éviter ce - voir le NX bit et Windows' "Exécution de Protection des Données" les paramètres (panneau de contrôle du système)
Donc, je pense que le PROCESSEUR sait si la mémoire est de données ou de code. Nul doute que le moderne pipeling Processeurs, nous avons maintenant également des instructions pour lire ce mémoire différemment pour aider le CPU est en cours de traitement aussi vite que possible (par exemple, le code ne peut pas être mis en cache, les données seront toujours accessibles de manière aléatoire plutôt que dans un cours d'eau)