dma vs unterbrechungsgesteuerte I / O

8

Ich bin ein wenig unklar über die Unterschiede zwischen DMA und Interrupt-I / O. (Lesen Sie derzeit Betriebssystem-Konzepte, 7. Ausgabe).

Insbesondere bin ich mir nicht sicher, wann die Interrupts in beiden Fällen auftreten und an welchen Stellen in beiden Fällen die CPU frei ist, andere Arbeiten auszuführen. Dinge, die ich gelesen habe, aber nicht unbedingt in Einklang bringen kann:

Unterbrechungsgesteuert

  1. Controller wird über Treiber
  2. initialisiert
  3. Der Controller überprüft Register, die vom Treiber geladen wurden, um eine Aktion zu bestimmen
  4. Die Datenübertragung von / zu Peripheriegeräten und dem Puffer des Controllers erfolgt.
  5. Der Controller gibt Interrupt aus, wenn (jedes gelesene Byte? jedes gelesene Wort? wenn der Puffer voll ist? wenn die Übertragung abgeschlossen ist?
  6. )
  7. Ich verstehe, dass die CPU nichts macht, während beide das Peripheriegerät & lt; - & gt; Controller I / O findet statt und der Controller & lt; - & gt; MM I / O findet statt?
  8. Wenn die Übertragung abgeschlossen ist oder wenn der Block voll ist, muss die CPU die Übertragung vom Controller-Puffer zu MM
  9. initialisieren

DMA

  1. Dasselbe wie oben, nur dass der Controller Daten aus seinem Puffer ohne CPU-Eingriff direkt an MM übertragen kann.
  2. Bedeutet dies, dass die CPU nur unterbrochen wird, wenn die gesamte Übertragung abgeschlossen ist, oder wird sie immer noch unterbrochen, wenn ein Controller-Puffer voll ist?
  3. Ist der einzige Unterschied, dass die CPU nicht länger auf den Controller & lt; - & gt; MM I / O, muss aber trotzdem unterbrochen werden, wenn ein Controller-Puffer voll ist? Oder versteckt DMA das auch von der CPU?
Joney 14.08.2014, 21:51
quelle

3 Antworten

6
  

Ich bin ein wenig unklar über Unterschiede zwischen DMA und Interrupt-I / O

Unterschiede zwischen DMA und Interrupts sind falsch, weil sie keine gegensätzlichen Konzepte sind.
DMA und Interrupts sind orthogonale Konzepte, und beide Konzepte werden normalerweise zusammen verwendet.

Die Alternative zu DMA ist die programmierte E / A, auch PIO genannt.
Die Alternative zu Interrupts ist das Polling.

  

Unterbrechungsgesteuert

Sie müssen genauer darauf eingehen, worauf Sie sich beziehen.
Wenn das System keine Interrupts verwendet, müsste es die Abfrage verwenden, um die Statusänderung eines Geräts zu erkennen.

PIO verwendet oft einen Interrupt (vom Gerät), um jede Byte- / Wortdatenübertragung zu initiieren. Dies hilft, die CPU-intensive Art von PIO zu verringern. Eine abgefragte PIO-Übertragung würde ansonsten CPU-Ressourcen vollständig verbrauchen.
Aber "PIO mit Interrupts" als einfach "Interrupts" oder "Interrupt-Driven" zu bezeichnen, ist ungenau und irreführend.

DMA-Übertragungen verwenden fast immer completion interrupt (vom DMA-Controller), um die CPU darüber zu informieren, dass eine Pufferübertragung abgeschlossen ist.
Die Abfrage nach der DMA-Vervollständigung (anstelle der Verwendung einer Beendigungsunterbrechung) belastet die CPU, die DMA entlasten soll. Ich habe einen Bootloader gesehen, der eine DMA-Übertragung initiiert und dann zur Fertigstellung abgefragt hat. Aber das ist eine einzelne Task-Umgebung, die es sich leisten kann, zu warten, während ein Betriebssystem die CPU-Verfügbarkeit maximieren muss. Das bedeutet, DMA mit Abschluss-Interrupts zu verwenden.

Diskutieren von "Unterbrechungen", ohne einen spezifischen Kontext, z. Die Quelle und der Grund, warum diese Unterbrechungen erzeugt werden, ist wahrscheinlich für Ihre Verwirrung verantwortlich.

  
  1. Controller wird über Treiber
  2. initialisiert   
  3. Der Controller überprüft Register, die vom Treiber geladen wurden, um eine Aktion zu bestimmen
  4.   
  5. Die Datenübertragung von / zu Peripheriegeräten und dem Puffer des Controllers erfolgt.
  6.   
  7. Der Controller gibt Interrupt aus, wenn (jedes gelesene Byte? jedes gelesene Wort? wenn der Puffer voll ist? wenn die Übertragung abgeschlossen ist?
  8. )   
  9. Es ist mein Verständnis, dass die CPU nichts macht, während sowohl das Peripheriegerät & lt; - & gt; Controller I / O findet statt und der Controller & lt; - & gt; MM I / O findet statt?
  10.   
  11. Wenn die Übertragung abgeschlossen ist oder wenn der Block voll ist, muss die CPU die Übertragung vom Controller-Puffer zu MM
  12. initialisieren   

Ein Problem, das ich bei Ihren Fragen sehe, ist, dass Sie eine mehrdeutige Konfiguration erstellen.
Sie erwähnen ein "Peripheriegerät", einen "Controller", die CPU und "MM" (vielleicht Hauptspeicher?).

Aus Software-Sicht könnte die periphere Verbindung eine der folgenden Topologien sein:

A. CPU & lt; - & gt; Gerät

B. CPU & lt; - & gt; Controller - [Gerät oder Medium]

C. CPU & lt; - & gt; Bus - Gerät
D. CPU & lt; - & gt; Bus - Controller - [Gerät oder Medium]

Verbindung A steht für ein Gerät, auf das die CPU direkt zugreifen kann, z. B. ein lokaler UART für einen seriellen Anschluss. Es kann Busse geben, die an der Hardware-Implementierung beteiligt sind, aber sie sind für die Software unsichtbar.

Verbindung B bezeichnet ein Gerät, das über eine Gerätesteuerung, z. MMC-Controller (MultiMediaCard) für SD-Karten und IDE-Festplattenlaufwerke (Integrated Disk Controller). Im Gegensatz zu A muss die CPU nur mit dem Gerätestecker und nicht mit dem Gerät selbst kommunizieren. Die Interaktionen zwischen der Steuerung und ihrem Gerät werden typischerweise nicht von der CPU gesteuert und minimal überwacht (wenn überhaupt). Die Steuerung existiert, um die Schnittstelle zwischen der CPU und ihrem Gerät zu vereinfachen.

Die Verbindungen C und D bezeichnen ein Gerät oder seinen Controller, auf das die CPU indirekt über einen Bus (z. B. USB, SPI oder SATA) zugreifen kann, z. B. einen USB-zu-Ethernet-Adapter oder SPI NOR-Flash. Der Befehl an das Gerät oder seinen Controller muss über den Bus übertragen werden. Zum Beispiel müssen die ATAPI-Befehle an den Festplattencontroller über den SATA-Controller übertragen werden. Im Gegensatz zu A ist der Bus Controller die Schnittstelle, über die die CPU E / A direkt ausführen muss.

Also sind Ihre # 3 und # 5a irrelevant. Die CPU ist nicht beteiligt. Auch können Sie nicht über die Controller-to-Device-Schnittstelle verallgemeinern, weil das für jedes periphere Subsystem eindeutig sein kann. Ein Controller kann nur ein Byte puffern, während ein anderer Controller einen ganzen Block zwischenspeichert, um ECC zu verifizieren.

  

DMA

     
  1. Dasselbe wie oben, nur dass der Controller Daten aus seinem Puffer ohne CPU-Eingriff direkt an MM übertragen kann.

  2.   
  3. Bedeutet dies, dass die CPU nur unterbrochen wird, wenn die gesamte Übertragung abgeschlossen ist, oder wird sie immer noch unterbrochen, wenn ein Controller-Puffer voll ist?

  4.   
  5. Ist der einzige Unterschied, dass die CPU nicht mehr auf den Controller warten muss & lt; - & gt; MM I / O, muss aber trotzdem unterbrochen werden, wenn ein Controller-Puffer voll ist?Oder versteckt DMA das auch von der CPU?

  6.   

Diese Szenarien und Fragen ergeben kaum Sinn. Die Richtung der Übertragung ist nicht spezifiziert, d.h. die CPU führt eine Lese- oder Schreiboperation aus.

DMA-Übertragungen verwenden fast immer eine completion interrupt (vom DMA-Controller), um der CPU mitzuteilen, dass eine Pufferübertragung abgeschlossen ist.

Sie verwenden wiederholt den Ausdruck ", wenn ein Controller-Puffer voll ist" , ohne die Quelle dieser Daten anzugeben. Wenn Sie nach Device-to-Controller-E / A fragen, ist diese E / A für die CPU normalerweise von minimaler Bedeutung und die Statusanzeigen sind Controller-spezifisch.

Sie scheinen nach einer blockartigen Übertragung zu fragen. Das Verständnis von Blockübertragungen vermittelt nicht unbedingt ein Verständnis für zeichenbasierte E / A.
Eine abgeleitete Frage zu zeichenbasierten (UART) E / A finden Sie unter Master für Interrupt-basiertes UART IO

    
sawdust 02.07.2016 23:40
quelle
2

Lassen Sie mich dies in einfache Worte für Ihr Verständnis setzen.

DMA, was für Direct Memory Access steht, ist ein System, bei dem eine Hardwarekomponente eines Computers Zugriff auf den Speicherbus erhält und die Übertragung steuert. Angenommen, ein CD / DVD-Laufwerk funktioniert normalerweise mit DMA. Aber denken Sie daran, dass die CPU immer der MASTER von allem ist, das heißt, obwohl die CPU dem DMA-Controller die Meisterschaft gegeben hat, hat er immer noch die Macht, DMA zu überprüfen. Er kann die Bussteuerung jederzeit neu ansteuern, es kann sogar die Aufgabe von DMA übernehmen. Es gibt Register, die verwendet werden, um die Bussteuerung von CPU zu DMA und von DMA zu CPU zu setzen. Sobald der DMA-Controller fertig ist, kann er die CPU unterbrechen oder signalisieren, dass sie ihren Job beendet hat. Das ist über DMA.

Kommen Sie nun zu Interrupt I / O. Interrupt-I / O ist viel häufiger als DMA. Ein Prozess durchläuft I / O normalerweise viele Male. Nach einer Eingabe vom Benutzer zu fragen wäre eine Interrupt-E / A. Nicht DMA. Es gibt zwei Arten von Interrupts.

  1. Software-Unterbrechung
  2. Hardware Interrupt

Jedem Interrupt ist eine spezielle Nummer zugewiesen. Und jeder Interrupt wird von einer Interrupt-Routine (einer einfachen Funktion) bedient, die irgendwo in Ihrem RAM gespeichert ist und die aus einer Tabelle aufgerufen wird, die aus Interrupt-Nummern besteht. Ich sage das für dein Verständnis. Wenn Sie Ihre Maus bewegen oder auf der Tastatur tippen, ist es tatsächlich ein Interrupt, der gerade passiert.

    
user3815757 04.11.2014 09:17
quelle
1

Im Falle eines Interrupt-gesteuerten IO erhält die MCU einen Interrupt für jedes Byte oder das Wort hängt davon ab, was der Mikrocontroller erleichtert. Die MCU bewegt sich in den Unterbrechungsmodus und verlässt den normalen Betriebsmodus für jeden Byte- / Wortempfang. Hier kann MCU nichts anderes tun, als die Daten von IO zu lesen und in den Speicher zu kopieren.

Im Falle von DMA führt der DMA dasselbe aus, was die MCU im Interruptfall ausführt. Also hier MCU ist frei, etwas anderes zu tun. Sie können DMA so konfigurieren, wie viele Bytes Sie unterbrechen müssen. Also hier ist es anders als IO Interrupt, weil MCU Interrupt für jedes Byte oder Wort nicht erhält; Rufen Sie stattdessen den Interrupt von DMA ab, wenn die von Ihnen konfigurierte Datenmenge empfangen wurde. Außerdem hat DMA die Daten von IO in RAM kopiert, so dass die MCU auch keinen Aufwand für das Kopieren aufbringen muss, was eine große Zeitersparnis bedeutet.

Wenn Sie also den DMA so konfiguriert haben, dass er bei 1 KB Daten unterbricht, erhält Ihre MCU 1 Interrupt für 1 KByte, andernfalls werden 1 K Interrupts empfangen, wenn Sie interruptgesteuerte IO verwenden. Die Verwendung von DMA reduziert also die Anzahl der Interrupts und erhöht die Leistung im Vergleich zu interruptgesteuerten IOs.

Aus diesem Grund werden DMAs meistens verwendet, wenn eine häufige Übertragung großer Datenmengen erforderlich ist.

    
Vicky 20.08.2014 10:40
quelle