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?
Répondre
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:
- Introduction
- CPU Caches
- Virtual Memory
- NUMA Support
- Programmers
- More Programmers
- Performance Tools
- Future
- 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.
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.
- 1. Comment afficher les données de la table récupérées depuis mysql?
- 2. entrer les données récupérées à la base de données
- 3. Comment cocher la case à cocher avec les données récupérées
- 4. Comment afficher les données JSON récupérées dans la table sectionnée
- 5. comment stocker les données dans la RAM en Verilog
- 6. Comment afficher les données récupérées de la base de données sous la forme
- 7. Accéder aux données récupérées
- 8. Sécuriser les données récupérées avec PHP
- 9. Vérifier si les données sont récupérées - CRM
- 10. JSON données redondantes récupérées
- 11. Saisie de données récupérées dans la base de données
- 12. comment valider les données récupérées à partir de la base de données en utilisant jmeter?
- 13. Comment réagir correctement sur les données récupérées dans spinejs
- 14. Les données récupérées n'apparaissent pas dans la listeview
- 15. Comment la disposition des données dans la mémoire RAM?
- 16. Les données de UseMachineKeyStore peuvent-elles être sauvegardées et récupérées?
- 17. Données erronées récupérées à partir de ListView
- 18. Modification des données récupérées de toute la classe d'étendue
- 19. Comment ajouter de l'espace entre les images récupérées en utilisant la base de données via php
- 20. Récupérer des données de la table en utilisant les données récupérées d'une autre table
- 21. Obtention des données récupérées par SqlDataSource (ASP.Net)
- 22. Le rendu a retourné les données JSON récupérées dans Backbone.js
- 23. Stockage des données récupérées thro Scrapy
- 24. Utiliser les données récupérées via l'API avec boucle
- 25. Générateur de prédicats pour les propriétés récupérées?
- 26. Routeurs Backbone: attendre que les données soient récupérées en premier
- 27. Comment surveiller l'utilisation totale de la RAM
- 28. comment obtenir la vitesse de ram?
- 29. Les données ne sont pas récupérées dans l'éditeur CK
- 30. Données Firebase non récupérées en textview
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
@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
c'est beaucoup plus complexe qu'un simple bus de données, il y a aussi le cache –