2012-03-17 12 views
5

En C, chaque octet est adressable individuellement. Supposons qu'un entier (disons qui utilise 4 octets) ait une adresse 0xaddr (qui est de 32 bits, en supposant que nous avons un processeur 32 bits avec un bus d'adresse de 32 bits et un bus de données de 32 bits) et supposons que la valeur de l'entier est 0x12345678. Maintenant, si je récupère cette valeur de la mémoire, comment le processeur fait-il cela? Est-ce que le processeur place 0xaddr (qui est l'adresse 32 bits) sur les lignes d'adresse, puis récupère les données de 8 bits dites 0x12. Et puis le processeur va rythme 0xaddr+1 sur les lignes d'adresse, puis extraire une autre donnée de 8 bits 0x34 et ainsi de suite pour les 4 octets d'un nombre entier? Ou est-ce que le processeur place simplement 0xaddr et lit les 4 octets en même temps en utilisant son bus de données complet de 32 bits?Comment les données de la RAM sont-elles récupérées?

+0

Cela dépend. De quel processeur parlez-vous exactement? IIRC le 8086 avait un bus de données 16 bits. Beaucoup de nouveaux modèles (Pentium et plus) avaient un 64 bits FSB. – harold

+0

@harold: pouvez-vous me dire comment il est différent pour les différents processeurs. Je demande en général et pas spécifique à un processeur. comment ça va se faire dire fo 8086 qui a 16 bits de bus de données, et comment pour le bus de données 32 bits et que pour 64? merci – mezda

+0

c'est beaucoup plus complexe qu'un simple bus de données, il y a aussi le cache –

Répondre

5

This is a well known article par la bibliothèque GNU C qui décrit l'accès à la mémoire (en particulier dans les systèmes PC actuels x86).Il va dans beaucoup plus de détails que vous pourriez jamais avoir besoin.

L'article complet est réparti sur plusieurs parties:

  1. Introduction
  2. CPU Caches
  3. Virtual Memory
  4. NUMA Support
  5. Programmers
  6. More Programmers
  7. Performance Tools
  8. Future
  9. Appendices

une chose que je voudrais ajouter à la réponse de gbulmer est que dans de nombreux systèmes d'obtenir un flux de données est plus rapide que vous attendez d'obtenir un seul mot. en d'autres termes, sélectionner l'endroit où vous voulez lire prend un certain temps, mais celui que vous avez sélectionné, lire à partir de ce point, puis les prochains 32 ou 64 bits, et le suivant ... est plus rapide que de passer à un endroit non connecté et lire une autre valeur. Ce qui domine la programmation moderne, ce n'est pas le comportement de récupération de la mémoire sur la carte mère, mais la question de savoir si les données sont dans un cache du processeur.

4

Si vous effectuez une recherche sur "Architecture d'ordinateur" sur le Web, vous aurez probablement des réponses à vos questions.

Pour votre question spécifique, un ordinateur 32 bits, avec un bus de données et d'adresse 32 bits, pour un cas simple, sans matériel obscurcissant. Il va lire 32 bits à partir d'une mémoire de 32 bits. C'est le genre de matériel qui existait depuis la fin des années 1970 comme minicompters (par exemple DEC VAX), et existe toujours en tant que microprocesseur (x86, ARM, Cortex-A8, MIPS32) et à l'intérieur de certains microcontrôleurs (ARM, Cortex- M3, PIC32, etc.). Le plus simple des cas: Le bus d'adresse est un ensemble de signaux (fils) qui transportent des signaux d'adresse vers la mémoire, plus quelques autres signaux pour communiquer si la mémoire doit être «lue» ou «écrite» (données direction), et si les signaux sur les fils d'adresse et de direction des données sont valides. Dans le cas de votre exemple, il peut y avoir 32 fils pour transporter le motif de bits de l'adresse.

Le bus de données est un second ensemble de fils qui communique la valeur vers et depuis la mémoire. La mémoire peut affirmer un signal indiquant que les données sont valides, mais cela peut être assez rapide pour que tout fonctionne correctement. Lorsque le processeur met l'adresse sur les signaux d'adresse, dit qu'il veut lire de la mémoire (la direction des données est 'read'), la mémoire récupérera la valeur stockée à cette adresse, et la mettra sur les signaux du bus de données. Le processeur (après des retards et des signaux appropriés) va échantillonner les fils du bus de données, et c'est la valeur qu'il utilise. Le processeur peut lire les 32 bits entiers et extraire un octet (si toutes les instructions l'exigent) en interne, ou le bus d'adresses externe peut fournir des signaux supplémentaires afin que le système de mémoire externe puisse être construit pour fournir l'octet approprié. , double octet ou octet quadruple. Pendant de nombreuses années, les versions de l'architecture du processeur ARM ne pouvaient lire que la totalité des 32 bits, et les plus petites, e, g, un octet, étaient extraites en interne.

Vous pouvez voir un exemple de ce type de jeu de signaux à http://www.cpu-world.com/info/Pinouts/68000.html Cette puce a seulement un bus d'adresse 24 bits, et un bus de données 16 bits. Il dispose de deux signaux (UDS et LDS) qui signalent si les signaux de données supérieurs sont utilisés, les signaux de données inférieurs ou les deux.

J'ai trouvé une explication raisonnablement détaillée à research.cs.tamu.edu/prism/lectures/mbsd/mbsd_l15.pdf J'ai trouvé cela en cherchant "68000 cycle de bus de mémoire".

Vous pouvez utilement rechercher MIPS, ARM ou x86 pour voir leur cycle de bus.

Questions connexes