| Zeile 2: | Zeile 2: | ||
Unter '''Direct Memory Access''' (abgekürzt '''DMA''') versteht man eine Methode, Daten von Peripheriegeräten zum Arbeitsspeicher und umgekehrt zu übertragen, ohne dafür die CPU benutzen zu müssen. | Unter '''Direct Memory Access''' (abgekürzt '''DMA''') versteht man eine Methode, Daten von Peripheriegeräten zum Arbeitsspeicher und umgekehrt zu übertragen, ohne dafür die CPU benutzen zu müssen. | ||
| − | Es gibt zwei grundlegend verschiedene Methoden, DMA umzusetzen: Entweder das betreffende Peripheriegerät ist in der Lage, auf die Daten im Arbeitsspeicher selbst zuzugreifen (als ''Busmaster''), oder es wird ein Hilfschip, der DMA-Controller, benötigt dessen einzige Aufgabe es ist, die Daten aktiv zwischen einem Peripheriegerät und dem Arbeitsspeicher zu transferieren. Die erste Methode wird bei [[PCI]]-Geräten | + | Es gibt zwei grundlegend verschiedene Methoden, DMA umzusetzen: Entweder das betreffende Peripheriegerät ist in der Lage, auf die Daten im Arbeitsspeicher selbst zuzugreifen (als ''Busmaster''), oder es wird ein Hilfschip, der DMA-Controller, benötigt, dessen einzige Aufgabe es ist, die Daten aktiv zwischen einem Peripheriegerät und dem Arbeitsspeicher zu transferieren. Die erste Methode wird bei [[PCI]]-Geräten verwendet und die zweite Methode wird von [[ISA]]-Geräten benutzt. Typische DMA- bzw. busmasterfähige PCI-Geräte sind dabei (S)ATA-Host-Controller, Netzwerkkarten und neuere USB-Host-Controller. |
| − | Busmastering bedeutet, dass ein Peripheriegerät selbstständig (in Abhängigkeit von entsprechenden Ereignissen) auf den Speicher oder auch auf andere Peripheriegeräte zugreifen kann | + | Busmastering bedeutet, dass ein Peripheriegerät selbstständig (in Abhängigkeit von entsprechenden Ereignissen) auf den Speicher oder auch auf andere Peripheriegeräte zugreifen kann – so wie die CPU auch selbstständig (in Abhängigkeit vom gerade ausgeführten Programm) auf den Speicher zugreift. Dieses Feature wird besonders von Multitasking-Betriebssystemen benötigt, da hier der Prozesswechsel sonst durch z. B. Festplattenzugriffe verzögert werden müsste. |
== Gemeinsamkeiten/Unterschiede von PCI-DMA und ISA-DMA == | == Gemeinsamkeiten/Unterschiede von PCI-DMA und ISA-DMA == | ||
| − | Eine wesentliche Gemeinsamkeit beider Methoden ist, dass die Software die Speicherzugriffe der Peripheriegeräte vorbereiten muss. Die Software muss bestimmen, an welchen (physischen) Adressen im Speicher die Daten liegen bzw. hingeschrieben werden sollen. Des | + | Eine wesentliche Gemeinsamkeit beider Methoden ist, dass die Software die Speicherzugriffe der Peripheriegeräte vorbereiten muss. Die Software muss bestimmen, an welchen (physischen) Adressen im Speicher die Daten liegen bzw. hingeschrieben werden sollen. Des Weiteren informieren die Peripheriegeräte die CPU meist mit einem Interrupt, wenn alle Daten transferiert wurden, damit der entsprechende Gerätetreiber die Daten verarbeiten und/oder neue Daten vorbereiten kann. |
Der wichtigste Unterschied beider Methoden ist, dass es bei PCI-DMA keine einheitliche Möglichkeit gibt, mit der die Software die DMA-Fähigkeiten der Peripheriegeräte steuern kann, wohingegen der ISA-DMA-Controller immer der selbe ist. | Der wichtigste Unterschied beider Methoden ist, dass es bei PCI-DMA keine einheitliche Möglichkeit gibt, mit der die Software die DMA-Fähigkeiten der Peripheriegeräte steuern kann, wohingegen der ISA-DMA-Controller immer der selbe ist. | ||
| − | Dagegen sind die Fähigkeiten der meisten PCI-DMA-Implementierungen deutlich leistungsfähiger, es können oft mehrere DMA-Jobs auf | + | Dagegen sind die Fähigkeiten der meisten PCI-DMA-Implementierungen deutlich leistungsfähiger, es können oft mehrere DMA-Jobs auf einmal dem Peripheriegerät mitgeteilt werden, sodass dieses deutlich seltener die CPU in Anspruch nehmen muss. Auch sind die meisten PCI-Geräte in der Lage, die Daten aus mehreren verteilten Speicherbereichen zusammenzutragen (''scatter/gather''). Der ISA-DMA-Controller kann Daten immer nur aus unmittelbar zusammenhängenden Speicherbereichen transferieren. |
| − | Grundsätzlich sind die PCI-DMA-Implementierungen deutlich leistungsfähiger; vor allem, weil sie auf die Bedürfnisse des entsprechenden PCI-Gerätes speziell zugeschnitten sind. Der ISA-DMA-Controller ist recht unflexibel, er ist z.B. nicht in der Lage, selbstständig einen neuen DMA-Job zu laden, sondern ist immer auf die Hilfe der Software angewiesen. Der ISA-DMA-Controller | + | Grundsätzlich sind die PCI-DMA-Implementierungen deutlich leistungsfähiger; vor allem, weil sie auf die Bedürfnisse des entsprechenden PCI-Gerätes speziell zugeschnitten sind. Der ISA-DMA-Controller ist recht unflexibel, er ist z. B. nicht in der Lage, selbstständig einen neuen DMA-Job zu laden, sondern ist immer auf die Hilfe der Software angewiesen. Der ISA-DMA-Controller kann nur Speicherbereiche in den ersten 16 MByte ansprechen. PCI-Geräte können mindestens 32-Bit-Adressen benutzen, viele sind auch fähig, mit 64-Bit-Adressen umzugehen. |
| − | ISA-DMA wird in heutigen PCs nur noch für das Floppy-Laufwerk und ganz selten für ISA-Soundkarten benutzt. In vielen Computern, die z.B. für den Einsatz als Steuerungen in der Industrie gedacht sind, gibt es diese Möglichkeit bereits gar nicht mehr (''Legacy-Free''). Es ist daher nur eine Frage der Zeit, bis dieser Mechanismus aus den PCs komplett verschwunden ist. Die Möglichkeiten, die moderne PCI-DMA-Implementierungen bieten, lassen sich nicht mit ISA-DMA realisieren | + | ISA-DMA wird in heutigen PCs nur noch für das Floppy-Laufwerk und ganz selten für ISA-Soundkarten benutzt. In vielen Computern, die z. B. für den Einsatz als Steuerungen in der Industrie gedacht sind, gibt es diese Möglichkeit bereits gar nicht mehr (''Legacy-Free''). Es ist daher nur eine Frage der Zeit, bis dieser Mechanismus aus den PCs komplett verschwunden ist. Die Möglichkeiten, die moderne PCI-DMA-Implementierungen bieten, lassen sich nicht mit ISA-DMA realisieren – nebst dessen, dass PCI und seine (aktuellen) Nachfolger wie PCI-Express, Hypertransport, PCI-X und AGP deutlich schneller arbeiten können. |
== PCI-DMA == | == PCI-DMA == | ||
| − | Da bei PCI-DMA jedes Gerät eine eigene Implementierung hat, kann man dazu kaum etwas allgemeines vermitteln. Als einfaches Beispiel kann z.B. die EHCI-Spezifikation gelten; dort wird gezeigt, wie alle relevanten Informationen über die zu erledigenden Arbeiten des EHCI-Host-Controllers und die zu transferierenden Daten in entsprechenden Strukturen im Arbeitsspeicher untergebracht sind. Auf diese Strukturen kann die Software mit ganz normalen Speicherzugriffen arbeiten und auch der EHCI-Host-Controller liest und modifiziert diese Strukturen mit eigenen Speicherzugriffen (eben als Busmaster) auf den Arbeitsspeicher. | + | Da bei PCI-DMA jedes Gerät eine eigene Implementierung hat, kann man dazu kaum etwas allgemeines vermitteln. Als einfaches Beispiel kann z. B. die EHCI-Spezifikation gelten; dort wird gezeigt, wie alle relevanten Informationen über die zu erledigenden Arbeiten des EHCI-Host-Controllers und die zu transferierenden Daten in entsprechenden Strukturen im Arbeitsspeicher untergebracht sind. Auf diese Strukturen kann die Software mit ganz normalen Speicherzugriffen arbeiten und auch der EHCI-Host-Controller liest und modifiziert diese Strukturen mit eigenen Speicherzugriffen (eben als Busmaster) auf den Arbeitsspeicher. |
| − | Eine ganz wesentliche Eigenschaft nahezu aller PCI-DMA-Implementierungen ist, dass die zu transferierenden Daten nicht an einem Stück im Arbeitsspeicher vorliegen müssen. Dieses Feature wird oft als ''Scatter/Gatter'' bezeichnet. Dabei bekommt das PCI-Gerät nicht einfach nur gesagt wo die Daten liegen bzw. hingeschrieben werden sollen, sondern es wird eine Liste mit einem oder mehreren Pointern/Größenangaben zu den einzelnen Datenhäppchen übergeben welche das PCI-Gerät dann selbstständig abarbeitet. Dieses Feature ist deshalb so wichtig weil in modernen Betriebssystemen das [[Paging]] benutzt wird und es daher nur sehr selten vorkommt, dass Daten, die im virtuellen Adressraum der Software am Stück vorliegen, auch physisch an einem Stück im Speicher liegen. | + | Eine ganz wesentliche Eigenschaft nahezu aller PCI-DMA-Implementierungen ist, dass die zu transferierenden Daten nicht an einem Stück im Arbeitsspeicher vorliegen müssen. Dieses Feature wird oft als ''Scatter/Gatter'' bezeichnet. Dabei bekommt das PCI-Gerät nicht einfach nur gesagt, wo die Daten liegen bzw. hingeschrieben werden sollen, sondern es wird eine Liste mit einem oder mehreren Pointern/Größenangaben zu den einzelnen Datenhäppchen übergeben, welche das PCI-Gerät dann selbstständig abarbeitet. Dieses Feature ist deshalb so wichtig, weil in modernen Betriebssystemen das [[Paging]] benutzt wird und es daher nur sehr selten vorkommt, dass Daten, die im virtuellen Adressraum der Software am Stück vorliegen, auch physisch an einem Stück im Speicher liegen. |