J'ai une question assez simple, mais je n'ai trouvé de réponse nulle part.
Sur un système Von-Neumann où le code et les données vivent dans la même RAM, le CPU doit récupérer toutes ses instructions de la mémoire. Maintenant, afin de déplacer de grandes quantités de données entre les composants de l'ordinateur, il existe un contrôleur d'accès direct à la mémoire qui permet aux périphériques d'avoir accès à la RAM principale du système.
Ma question est la suivante: si le DMA permet un transfert de données (éventuellement très long) entre, disons, le disque dur et la RAM, cela ne signifie-t-il pas que le CPU ne peut pas utiliser la RAM et ne peut donc pas récupérer sa prochaine instruction?
En bref, le DMA est destiné à remplacer le processeur arbitrant toutes les lectures et écritures d'E / S, afin de libérer le processeur pour faire autre chose. Cependant, s'il ne peut pas récupérer ses instructions dans la RAM, il n'a pas été libéré de toute façon.
Y a-t-il des détails qui me manquent ici?
Merci
la source
Réponses:
Vous avez raison de dire que le processeur ne peut pas accéder à la mémoire pendant un transfert DMA. Cependant, il existe deux facteurs qui, combinés, permettent un accès apparent à la mémoire parallèle par le processeur et le périphérique effectuant le transfert DMA:
mov
instruction avec un opérande indirect).En combinaison, ces deux facteurs signifient que le périphérique effectuant le transfert DMA aura peu d'impact sur la vitesse du processeur.
EDIT: J'ai oublié de mentionner qu'il y a aussi le facteur de cache du processeur, qui tant que le code que le processeur exécute est dans le cache, il n'aura pas besoin d'accéder à la mémoire réelle pour récupérer les instructions, donc un transfert DMA ne se passe pas pour se mettre en travers du chemin (bien que si l'instruction doit accéder à la mémoire, alors un véritable accès à la mémoire aura lieu - potentiellement devant attendre une pause dans l'utilisation de la mémoire par le périphérique DMA).
la source
S'il n'y a qu'une seule interface mémoire, il y aurait du matériel pour arbitrer entre les requêtes. En règle générale, un processeur aurait la priorité sur les E / S sans les E / S affamées, mais même avec des E / S toujours prioritaires, le processeur aurait certaines opportunités d'accéder à la mémoire car les E / S ont tendance à avoir des demandes de bande passante plus faibles et à être intermittentes.
De plus, il existe généralement plusieurs interfaces vers la mémoire. Les processeurs plus performants ont généralement des caches (si le DMA n'est pas cohérent, les caches n'ont même pas besoin d'être espionnés; même avec l'espionnage, la surcharge serait généralement faible en raison de la différence de bande passante entre le cache et la mémoire principale ou (lorsque le DMA transfère vers L3 cache) entre le cache L3 et le cache L1), fournissant une interface distincte pour accéder à la mémoire. Les microcontrôleurs accèdent souvent aux instructions à partir d'une mémoire flash distincte, ce qui permet d'aller chercher pendant le DMA vers la mémoire sur puce, et ont souvent une mémoire étroitement couplée avec une interface indépendante (permettant de nombreux accès aux données pour éviter les conflits DMA).
Même avec une seule interface mémoire, la bande passante de pointe sera généralement supérieure à la bande passante généralement utilisée. (Pour la récupération des instructions, même un petit tampon avec un chargement de récupération plus large que la moyenne à partir de la mémoire permettrait la récupération des instructions à partir du tampon pendant qu'un autre agent utilise l'interface mémoire, exploitant la tendance du code à ne pas se ramifier.)
Notez également que parce qu'un processeur accède aux données, s'il existe une seule interface mémoire, il doit y avoir un mécanisme d'arbitrage entre les accès aux données et les accès aux instructions.
Si le processeur (avec une seule interface mémoire) était obligé d'implémenter une copie d'un tampon de périphérique d'E / S vers la mémoire principale, il devrait également récupérer des instructions pour effectuer la copie. Cela pourrait signifier deux accès à la mémoire par mot transférés même dans un ISA avec des opérations de mémoire-mémoire (un ISA de stockage de charge pourrait nécessiter trois accès à la mémoire ou plus si l'adressage de mémoire post-incrémentation n'est pas fourni); cela s'ajoute à l'accès aux E / S qui, dans les anciens systèmes, pouvait partager la même interface que la mémoire principale. Un moteur DMA n'accède pas aux instructions en mémoire et évite ainsi cette surcharge.
la source
Puisqu'il n'y a qu'un seul système de bus, qui est bloqué par l'accès à la mémoire du DMA, le CPU ne peut pas fonctionner tant que le DMA déplace des données et est donc arrêté.
L'idée derrière cela est la suivante:
Si vous souhaitez copier des données consécutives de la mémoire, le CPU devra faire quelque chose comme ça:
Calculer l'adresse-> lire les données-> calculer la nouvelle adresse (+ 1 mot) -> lire les données ...
Alors que le DMA fait le calcul de la nouvelle adresse en parallèle (selon le mode) et est donc plus rapide. Ainsi, le DMA peut fonctionner à plein débit (théoriquement).
la source
De manière générale, non.
Dans la plupart des architectures système, toutes les demandes d'accès à la mémoire ont une priorité qui leur est affectée. Lorsqu'il y a plus de demandes simultanées de mémoire que le système ne peut gérer à la fois, les demandes avec une priorité plus élevée sont traitées en premier. Les demandes de mémoire initiées par la CPU reçoivent généralement la priorité la plus élevée possible.
la source
En général non.
Certains systèmes bien sûr, un seul maître à la fois. Un peu d'un ancien design si tel est le cas (même les anciens designs avaient souvent des solutions parallèles). Un type de bus moderne, bien que chaque bus (adresse, écriture de données, lecture de données) fonctionne indépendamment et ait une étiquette ou un identifiant par cycle d'horloge pour indiquer à quelle transaction un cycle d'horloge est associé. Ainsi, vous pouvez avoir plusieurs / beaucoup de transactions en vol en même temps dans les deux sens, avec différentes transactions mélangées sur les bus de données en lecture ou en écriture. Qui ira ensuite serait basé sur la priorité, il n'y a pas de règle selon laquelle les transactions sur le bus devraient sortir dans l'ordre dans lequel les instructions du logiciel sont présentées, le processeur peut déterminer qu'il peut démarrer certaines plus tôt que d'autres, et naturellement les réponses vont revenir dans des ordres différents selon la proximité et la rapidité de la cible. De même, les récupérations ne sont pas en ordre, la prédiction de branche déclenche des récupérations aléatoires chaque fois que cela semble nécessaire.
Une transaction dma importante nécessiterait bien sûr beaucoup plus de bande passante de bus, mais dire que le processeur se bloque, pas nécessairement le cas, dépend aussi de l'architecture et du code. Le code peut avoir une instruction qui dit décrochage jusqu'à ce que cette fin de signal / événement de transfert se produise, puis assurez-vous que le processeur finira ce qu'il peut faire dans le tuyau puis décroche. Mais cela ou certaines architectures peuvent ne pas vous obliger à bloquer, pas vraiment sage de le faire de toute façon, tant de bande passante gaspillée. Quel serait l'intérêt de dma de toute façon s'il ne fonctionne pas en parallèle, il suffit de coder le transfert en boucle, les récupérations ajoutent des cycles, peut-être qu'en fonction de l'architecture, ils ne sont pas aussi coûteux que la surcharge logique dma, la puissance, etc. Comprenez comment le dma fonctionne pour l'architecture et le système particuliers sur lesquels vous vous trouvez et décidez si cela vaut la peine d'être utilisé,
Il n'y a pas de réponse générique sur le fonctionnement de dma, il dépend fortement de la conception du système et de tous les composants du système.
la source