DMA-Übertragung von RAM zu RAM

Lesezeit: 3 Minuten

Ein Freund von mir hat mir gesagt, dass der DMA-Controller auf der x86-Architektur nicht zwischen zwei verschiedenen RAM-Speicherorten übertragen kann. Es kann nur zwischen RAM und Peripherie (z. B. PCI-Bus) übertragen werden.

Ist das wahr?

Weil AFAIK DMA-Controller sollte zwischen beliebigen Geräten die am BUS sitzen und eine Adresse haben. Insbesondere sehe ich kein Problem, wenn Quell- und Zieladressen zum selben physischen Gerät gehören.

  • Warum RAM von einem Ort zum anderen kopieren? x86 verfügt über ein Speicher-Paging-System, sodass jede Speicherseite im virtuellen Speicher an jeder Adresse sichtbar sein kann.

    – GJ.

    28. November 2010 um 16:55 Uhr


  • Wow! Das ist interessant. Jetzt sehe ich warum dort kann Probleme mit einer solchen Übertragung sein. Es kann nicht in einem einzigen Zyklus durchgeführt werden … Aber OTOH gibt es moderne Architekturen, in denen Sie einen sogenannten “doppelten Speicherkanal” haben. Hier du kann Lesen + Schreiben in einem einzigen Zyklus, nicht wahr?

    – Valdo

    28. November 2010 um 16:33 Uhr

  • Wie auch immer, Dual-Cycle-Übertragungen können langsamer sein. Während einer solchen Übertragung kann die CPU jedoch für etwas anderes verwendet werden. Gibt es nicht trotzdem einen Grund, eine solche Übertragung per DMA durchzuführen?

    – Valdo

    28. November 2010 um 16:34 Uhr

  • Here you can read+write in a single cycle, can't you? Ich bin da nicht hundertprozentig überzeugt, aber abgesehen von anderen Machbarkeitsfallen würde ich mir vorstellen, dass dieses Kunststück nur möglich ist, wenn die Module unganged sind, also separate Busse bereitstellen und die Quell- und Zielbereiche auf zwei separaten Speichermodulen liegen . Dies würde die Verwendbarkeit stark einschränken.

    – András Wass

    28. November 2010 um 17:24 Uhr

  • Isn't there a reason anyway to do such a transfer via DMA? Nun, es ist besser, das Kopieren ganz zu vermeiden. Selbst wenn Sie dies nicht tun, ist es vielleicht erwähnenswert, dass CPUs Daten nach aktuellem Stand viel schneller verbrauchen können, als das Speichersubsystem bereitstellen kann. Da Sie den Speichercontroller belegt halten, können geringere Einsparungen erzielt werden, als Sie intuitiv erwarten. Bsp. I/OAT (linuxfoundation.org/collaborate/workgroups/networking/i/oat) erzielte beim Benchmarking 10 % Einsparungen bei der CPU-Auslastung beim Empfangen und keine Einsparungen beim Senden.

    – András Wass

    28. November 2010 um 17:37 Uhr


  • Ich erinnere mich an “The Undocumented PC”, dass es darum geht, den alten x86-DMA-Kanal zu nehmen, der für die Speicheraktualisierung reserviert ist, und diesen für die Hälfte der Übertragung zu stehlen, während der 1 normalerweise freie Kanal für den Schreibteil verwendet wird. Kein Problem, da es eine Aktualisierung verursacht, wenn Sie es verwenden, aber auf alter Hardware, die die Aktualisierung erfordert, vergessen Sie NICHT, es nach dem Verschieben auf die Standardeinstellung zurückzusetzen, oder Sie werden schnell auf Speicherprobleme stoßen! 🙂

    – Brian Knoblauch

    10. Februar 2011 um 21:11 Uhr

  • Funktioniert es mit PCI/PCIex? Wie achtet man auf Kohärenz? Führt der Speichercontrollerchip tatsächlich den DMA aus?

    – Pyjong

    20. April 2016 um 12:33 Uhr

  • Was meinst du mit “DMA-Engines”? Unterscheiden sich die DMA-Controller-Spezifikationen für verschiedene Chipsätze basierend auf x86?

    – Valdo

    28. November 2010 um 15:53 ​​Uhr

  • Ich habe Ihren zweiten (oder dritten, wenn Sie den Einzeiler mitzählen) Absatz als allgemeine Aussage interpretiert. Ich arbeite nicht mit x86-Controllern, aber ich bin definitiv auf PowerPC-DMA-Controller gestoßen, die keine RAM-zu-RAM-Übertragungen durchführen können, weshalb ich diese Aussage gemacht habe.

    – lijie

    28. November 2010 um 15:55 Uhr

1055810cookie-checkDMA-Übertragung von RAM zu RAM

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy