Ich habe eine ziemlich einfache Frage, aber ich konnte nirgendwo eine Antwort darauf finden.
In einem Von-Neumann-System, in dem sich Code und Daten im selben RAM befinden, muss die CPU alle ihre Anweisungen aus dem Speicher abrufen. Um große Datenmengen zwischen Computerkomponenten zu verschieben, gibt es jetzt einen direkten Speicherzugriffscontroller, mit dem Peripheriegeräte auf den Hauptsystem-RAM zugreifen können.
Meine Frage lautet: Wenn der DMA eine (möglicherweise sehr lange) Datenübertragung zwischen z. B. der Festplatte und dem RAM zulässt, bedeutet dies nicht, dass die CPU den RAM nicht verwenden und daher den nächsten Befehl nicht abrufen kann?
Kurz gesagt, der DMA soll den Prozessor ersetzen, der alle E / A-Lese- und Schreibvorgänge entscheidet, um den Prozessor für andere Aufgaben freizugeben. Wenn es jedoch seine Anweisungen nicht aus dem RAM abrufen kann, wurde es trotzdem nicht freigegeben.
Gibt es ein Detail, das mir hier fehlt?
Vielen Dank
quelle
Antworten:
Sie haben Recht, dass die CPU während einer DMA-Übertragung nicht auf den Speicher zugreifen kann. Es gibt jedoch zwei Faktoren, die in Kombination einen offensichtlichen parallelen Speicherzugriff durch die CPU und das Gerät ermöglichen, das die DMA-Übertragung durchführt:
mov
Befehl mit einem indirekten Operanden).In Kombination bedeuten diese beiden Faktoren, dass das Gerät, das die DMA-Übertragung durchführt, nur einen geringen Einfluss auf die CPU-Geschwindigkeit hat.
BEARBEITEN: Ich habe vergessen zu erwähnen, dass es auch den Faktor des CPU-Cache gibt. Solange sich der Code, den die CPU ausführt, im Cache befindet, muss sie nicht auf den realen Speicher zugreifen, um Anweisungen abzurufen, sodass keine DMA-Übertragung stattfindet in die Quere kommen (obwohl, wenn der Befehl auf den Speicher zugreifen muss, dann wird offensichtlich ein echter Speicherzugriff stattfinden - möglicherweise muss auf eine Unterbrechung in der Verwendung des Speichers durch das DMA-Gerät gewartet werden).
quelle
Wenn es eine einzelne Speicherschnittstelle gibt, wäre Hardware vorhanden, um zwischen Anforderungen zu vermitteln. Normalerweise wird einem Prozessor Vorrang vor E / A eingeräumt, ohne dass die E / A ausfällt, aber selbst wenn E / A immer Vorrang hat, hat der Prozessor einige Möglichkeiten, auf den Speicher zuzugreifen, da E / A tendenziell geringere Bandbreitenanforderungen haben und intermittierend arbeiten.
Darüber hinaus gibt es normalerweise mehr als eine Schnittstelle zum Speicher. Prozessoren mit höherer Leistung haben in der Regel Caches (wenn DMA nicht kohärent ist, müssen die Caches nicht einmal abgehört werden). Selbst beim Abhören wäre der Overhead im Allgemeinen gering, da sich die Bandbreite zwischen Cache und Hauptspeicher unterscheidet oder (wenn der DMA zu L3 überträgt) Cache) zwischen L3-Cache und L1-Cache) und bietet eine separate Schnittstelle für den Speicherzugriff. Mikrocontroller greifen häufig auf Anweisungen aus einem separaten Flash-basierten Speicher zu, sodass das Abrufen während des DMA-Vorgangs zum On-Chip-Speicher erfolgen kann, und sie verfügen häufig über einen eng gekoppelten Speicher mit einer unabhängigen Schnittstelle (wodurch viele Datenzugriffe möglich sind, um DMA-Konflikte zu vermeiden).
Selbst mit einer einzelnen Speicherschnittstelle ist die Spitzenbandbreite im Allgemeinen höher als die normalerweise verwendete Bandbreite. (Beim Abrufen von Befehlen würde selbst ein kleiner Puffer mit überdurchschnittlichem Laden von Befehlen aus dem Speicher das Abrufen von Befehlen aus dem Puffer ermöglichen, während ein anderer Agent die Speicherschnittstelle verwendet, wobei die Tendenz des Codes ausgenutzt wird, nicht zu verzweigen.)
Da ein Prozessor auf Daten zugreift, muss bei Vorhandensein einer einzelnen Speicherschnittstelle ein Mechanismus für die Entscheidung zwischen Datenzugriffen und Befehlszugriffen vorhanden sein.
Wenn der Prozessor (mit einer einzelnen Speicherschnittstelle) gezwungen wäre, eine Kopie von einem E / A-Gerätepuffer in den Hauptspeicher zu implementieren, müsste er auch Anweisungen abrufen, um die Kopie auszuführen. Dies kann bedeuten, dass zwei Speicherzugriffe pro Wort auch in einer ISA mit Speicheroperationen übertragen werden (eine Ladespeicher-ISA kann drei oder mehr Speicherzugriffe erfordern, wenn keine Speicheradressierung nach dem Inkrement vorgesehen ist). Das ist zusätzlich zu dem E / A-Zugriff, der in alten Systemen möglicherweise dieselbe Schnittstelle wie der Hauptspeicher verwendet. Eine DMA-Engine greift nicht auf Anweisungen im Speicher zu und vermeidet so diesen Overhead.
quelle
Da es nur ein Bussystem gibt, das durch den Speicherzugriff des DMA blockiert ist, kann die CPU nicht arbeiten, solange der DMA Daten verschiebt und daher angehalten wird.
Die Idee dahinter ist die folgende:
Wenn Sie aufeinanderfolgende Daten aus dem Speicher kopieren möchten, müsste die CPU etwa so vorgehen:
Adresse berechnen-> Daten lesen-> neue Adresse berechnen (+ 1 Wort) -> Daten lesen ...
Während der DMA die Berechnung der neuen Adresse parallel durchführt (abhängig vom Modus) und daher schneller ist. Somit kann der DMA (theoretisch) mit vollem Busdurchsatz arbeiten.
quelle
Generell nein.
In den meisten Systemarchitekturen wird allen Anforderungen für den Speicherzugriff eine Priorität zugewiesen. Wenn mehr gleichzeitige Speicheranforderungen vorliegen, als das System gleichzeitig verarbeiten kann, werden zuerst Anforderungen mit einer höheren Priorität bearbeitet. Von der CPU initiierte Speicheranforderungen erhalten in der Regel die höchstmögliche Priorität.
quelle
Im Allgemeinen nicht.
Einige Systeme stellen sicher, dass jeweils nur ein Master vorhanden ist. Ein bisschen älteres Design, wenn das der Fall ist (selbst alte Designs hatten oft parallele Lösungen). Ein moderner Bustyp, bei dem jeder Bus (Adresse, Schreibdaten, Lesedaten) unabhängig arbeitet und ein Tag oder eine ID pro Taktzyklus aufweist, um anzuzeigen, welcher Transaktion ein Taktzyklus zugeordnet ist. Sie können also viele / viele Transaktionen gleichzeitig in beide Richtungen ausführen, wobei verschiedene Transaktionen auf den Lese- oder Schreibdatenbussen gemischt werden. Wer als nächstes loslegen kann, ist prioritätsbasiert. Es gibt keine Regel, dass die Transaktionen auf dem Bus in der Reihenfolge ausgeführt werden müssen, in der die Softwareanweisungen angeordnet sind. und natürlich werden die Antworten auch in unterschiedlicher Reihenfolge zurückkommen, je nachdem, wie nah und schnell das Ziel ist. Ebenso sind Abrufe nicht in Ordnung, die Verzweigungsvorhersage löst zufällig aussehende Abrufe aus, wann immer es sich anfühlt.
Eine große DMA-Transaktion würde sicher viel mehr Busbandbreite erfordern, aber zu sagen, dass der Prozessor blockiert, was nicht unbedingt der Fall ist, hängt auch von der Architektur und dem Code ab. Der Code kann eine Anweisung enthalten, die "stall" sagt, bis das Signal / Ereignis für das Ende der Übertragung auftritt, und dann sicherstellt, dass der Prozessor beendet, was er in der Pipe tun kann, und dann blockiert. Aber das oder einige Architekturen erfordern möglicherweise nicht, dass Sie blockieren, und es ist auch nicht wirklich klug, so viel verschwendete Bandbreite zu blockieren. Was wäre der Sinn von DMA überhaupt, wenn es nicht parallel betrieben wird? Codieren Sie einfach die Übertragung in einer Schleife, holen Sie einige Zyklen hinzu, je nach Architektur sind sie möglicherweise nicht so kostspielig wie der Aufwand für die DMA-Logik, die Leistung usw. Verstehen Sie, wie die dma arbeitet für die jeweilige Architektur und das System, auf dem Sie sich befinden, und entscheidet, ob es sich überhaupt lohnt, es zu verwenden.
Es gibt keine generische Antwort auf die Funktionsweise von dma. Es hängt stark vom Systemdesign und allen Komponenten im System ab.
quelle