2010-11-28 17 views
14

Ein Freund von mir hat mir gesagt, dass auf DMA-Controller x86-Architektur nicht zwischen zwei verschiedenen RAM-Standorten übertragen kann. Es kann nur zwischen RAM und Peripheriegeräten (z. B. PCI-Bus) übertragen werden.DMA-Übertragung RAM-to-RAM

Ist das wahr?

Da AFAIK DMA-Controller sollte zwischen beliebigen Geräten, die auf BUS sitzen und eine Adresse haben können. Insbesondere sehe ich kein Problem, wenn sowohl Quell- als auch Zieladressen zu demselben physikalischen Gerät gehören.

+0

Warum RAM von einem Ort zum anderen kopieren? x86 hat ein Speicher-Paging-System, so dass jede Speicherseite im virtuellen Speicher an jeder Adresse sichtbar sein kann. –

+0

@GJ Nicht im Realmodus. –

Antwort

12

ISA (erinnern Sie sich? ;-) DMA-Chips haben sicherlich eine Fetch-and-Deposit Übertragungsart.

jedoch vom MASM32 forums:

Hallo,

Überprüfung in "The Undocumented PC", sagt er Speicher DMA-Speicher ist möglich. Er fährt fort zu sagen, dass gibt es Probleme, Einschränkungen, und dass die CPU kann die Kopie schneller als die DMA-Hardware sowieso (MOVSD auf 386+).

So scheint es ein ja sein kann, aber wen interessierts, eine Art Sache.

Grüße,

Steve N.

+0

Wow! Das ist interessant. Jetzt sehe ich, warum es Probleme mit einer solchen Übertragung geben kann. Es kann nicht in einem einzigen Zyklus getan werden ... Aber OTOH gibt es moderne Architekturen, wo Sie einen sogenannten "Dual-Speicher-Kanal" haben. Hier kannst du ** in einem Zyklus lesen + schreiben, oder? – valdo

+0

Zwei-Zyklus-Übertragungen können jedoch langsamer sein. Während einer solchen Übertragung kann die CPU jedoch für etwas anderes verwendet werden. Gibt es keinen Grund, eine solche Übertragung per DMA durchzuführen? – valdo

+0

'Hier können Sie lesen + schreiben in einem einzigen Zyklus, nicht wahr?Ich bin da nicht hundertprozentig positiv, aber abgesehen von anderen Machbarkeitsfallen, würde ich mir vorstellen, dass dieses Kunststück nur möglich ist, wenn die Module nicht gekoppelt sind, so dass sie getrennte Busse bereitstellen und die Quell- und Zielbereiche auf zwei separaten Speicherplätzen liegen Module. Dies würde seine Verwendbarkeit stark einschränken. –

2

Es gibt definitiv DMA-Engines, die nicht zwischen 2 RAM-Adressen übertragen können, daher basiert der zweite Teil der Frage bereits auf einer falschen Prämisse.

+0

Was meinst du mit "DMA-Motoren"? Ändern sich die DMA-Controller-Spezifikationen für verschiedene Chipsätze auf Basis von x86? – valdo

+2

Ich interpretierte Ihren zweiten (oder dritten, wenn Sie den Einzeiler zählen) Absatz als eine allgemeine Aussage. Ich arbeite nicht mit x86-Einsen, aber ich habe definitiv PowerPC-DMA-Controller angetroffen, die keine Ram-to-Ram-Transfers durchführen können, weshalb ich diese Aussage gemacht habe. – lijie

7

Ja, Speicher auf die Speicherübertragung ist möglich, auch bis zu 80386 Familie, die ich mit "modernen" x86 des versucht haben :)

Geben RAM für Quelle und Ziel. Je nachdem, welches Gerät Sie programmieren und ob Sie den Cache aktiviert haben, müssen Sie möglicherweise auf die Kohärenz des L1-Cache achten.

Möglicherweise finden Sie im Linux-Kernel Code zum Auffrischen von Video-RAM-Seiten im Schattenspeicher. Das läutet eine Glocke.

+0

Funktioniert es mit PCI/PCIex? Wie achtet man "auf Kohärenz"? Führt der Speichercontroller tatsächlich die DMA? – Pyjong

0

Auf ARM Mem-to-Mem DMA die Leistung deutlich verbessern.