Přímý přístup do paměti ( angl. direct memory access , DMA ) - režim výměny dat mezi počítačovými zařízeními nebo mezi zařízením a hlavní pamětí , na kterém se neúčastní centrální procesorová jednotka (CPU). Protože data nejsou odesílána do az CPU, přenosová rychlost se zvyšuje.
Pokud potřebujete zaplnit paměťové buňky umístěné na po sobě jdoucích adresách, použijte provozní režim sběrnice "burst" ( anglicky burst ):
Podobná optimalizace CPU s pamětí je extrémně obtížná.
V původní architektuře IBM PC ( sběrnice ISA ) bylo DMA možné pouze s hardwarovým řadičem DMA ( čip Intel 8237 ).
Řadič DMA má přístup k systémové sběrnici nezávisle na CPU a má několik registrů . Registry řadiče DMA jsou k dispozici CPU pro čtení a zápis a používají se k nastavení:
Zvažte proces čtení dat ze zařízení. CPU zapisuje hodnoty do registrů řadiče DMA, odesílá příkaz zařízení (například disku) ke čtení dat. Zařízení čte data (například z disku) a zapisuje do své vnitřní paměti (buffer). Řadič DMA nastaví adresu paměti PC na adresové sběrnici , odešle do zařízení požadavek na načtení dat z vnitřní paměti (bufferu) zařízení. Zařízení přijme požadavek a ani neví, zda požadavek přišel z CPU nebo z DMA řadiče. Zařízení odešle další slovo ze své vnitřní paměti (bufferu) do PC RAM na adresu umístěnou na adresové sběrnici . Zařízení poté odešle signál do ovladače DMA indikující konec nahrávání. Řadič DMA zvýší adresu paměti PC a vloží ji na adresovou sběrnici , sníží hodnotu svého bajtového čítače a opět vyšle požadavek na načtení dat z vnitřní paměti (bufferu) zařízení. Smyčka se opakuje, dokud hodnota čítače nebude nulová. Po skončení cyklu zařízení iniciuje přerušení procesoru , což indikuje dokončení přenosu dat.
Řadič DMA schopný provádět více operací paralelně se nazývá vícekanálový.
Sběrnice MicroChannel , SBus , silně ovlivněná PCI a jeho koncepčními deriváty AGP a PCI-X , používá jinou implementaci DMA. Tyto sběrnice umožňují libovolnému zařízení oznámit potřebu zabavení sběrnice, takovou potřebu uspokojí při první příležitosti tzv. arbitr. Zařízení, které úspěšně zachytí sběrnici, nezávisle nastaví adresu a řídicí signály na sběrnici a na sběrnici plní po určitou dobu stejnou vedoucí roli jako CPU. Přístup CPU ke sběrnici je pak dočasně zakázán.
V takové implementaci DMA neexistuje žádný řadič s přímým přístupem do paměti a žádné vstupní číslo řadiče s přímým přístupem do paměti.
Některá starší zařízení PCI , jmenovitě implementace zvukových karet rodiny Sound Blaster , používaly řadič 8237 DMA z původní architektury IBM PC . Toto použití je pro PCI jistě zastaralé , ale bylo zachováno, aby byla zajištěna plná kompatibilita softwaru a ovladačů se zvukovými kartami Sound Blaster pro sběrnici ISA .
Tato podpora se nazývá "Distributed DMA" (D-DMA) a je hardwarově implementována jak v zařízení, tak v logice můstku PCI - ISA , ve kterém je logika řadiče 8237 DMA (originál pro IBM PC ) . také umístěný na PCI systémech . Implementace využívá dva požadavky: první požadavek je ze zařízení na PCI-ISA bridge, druhý je z mostu do PC RAM .
Kromě zmíněných implementací Sound Blaster prakticky žádná zařízení PCI nepoužívají koncept „čísla vstupu řadiče DMA“ a 8237 už vůbec ne.
V operačních systémech se stránkovanou virtuální pamětí , jako je Windows a řada UNIX , může být souvislá oblast virtuálních adres implementována nespojitými fyzickými stránkami.
Provedení DMA pro takový region je docela výzva. Obtížným úkolem je také provedení DMA na dodané paměti.
Řešení tohoto problému vyžaduje identifikaci fyzických stránek, které implementují region, a jejich zablokování před expedicí přístupem k subsystému virtuální paměti. Dále je možné najít fyzické adresy stránek regionu, které v obecném případě nejsou souvislé a tvoří takzvaný "scatter-gather list" ( anglicky scatter-gather list , SGL ).
Úkol provést DMA na takovém seznamu lze vyřešit jedním z následujících způsobů.
Podporováno všemi předními operačními systémy . Aktivace podpory v systému Windows vyžaduje volání s parametrem nastaveným na . IoGetDmaAdapterDEVICE_DESCRIPTION::ScatterGatherFALSE
nedostatky:Používá se ve starších 8bitových řadičích SCSI dodávaných se skenery typu HP ScanJet .
nedostatky:Zařízení čte SGL se stejným DMA mechanismem zamykání sběrnice jako skutečná data, čímž implementuje funkcionalitu procesoru, který čte a provádí svůj vlastní „program“ implementovaný jako seznam deskriptorů SGL . Tato architektura se nazývá "chain DMA" ( angl. chain DMA ), implementovaná téměř ve všech standardních výbavách moderního počítače - Intel IDE ( ang. elektronika integrovaného disku ) (v primitivní podobě), USB UHCI , USB OHCI , 1394 OHCI , stejně jako ve většině adaptérů PCI , Ethernet a SCSI (dokonce i ve starším AIC78xx ). Dobrý příklad implementace této architektury ve velmi složité a pokročilé podobě je uveden v hardwarové specifikaci 1394 OHCI . Podle některých zpráv byla tato architektura, nazývaná „kanálové programy“, používána již v IBM 360 , známém v SSSR jako ES počítače .
nedostatky:Takové zařízení se nazývá IOMMU ( Input/output memory management unit ) . Byl implementován jak na počítačích od Sun Microsystems pro sběrnici SBus , tak na počítačích od DEC Alpha pro sběrnici PCI . Až donedávna nebyl téměř nikdy implementován v konvenčních x86 /PCI systémech, i když v současnosti existuje trend tuto situaci změnit, zejména s cílem zlepšit výkon hypervizorů virtuálních strojů . Vždy implementováno pro sběrnici AGP s názvem AGP GART pro usnadnění náhodného přístupu GPU k texturám uloženým v hlavní paměti. Ze strany zařízení byl tento hardware standardizován specifikací AGP , ze strany softwaru žádná standardizace neexistovala a implementace závisela na výrobci Northbridge čipu mezi AGP a pamětí (proto potřeba „ AGP driver “, například pro čipy Intel ). Sada volání jader vyvinutých operačních systémů , jako je Windows , vždy obsahovala architektonickou abstrakci IOMMU ( a tato volání také podporuje bounce buffer , chápaný jako druh IOMMU ), což umožňuje, aby je podporoval stejný ovladač zařízení , když je připojen. prostřednictvím různých IOMMU . agp440.sys MapTransferGetScatterGatherList
nedostatky:Původní řadič pevného disku IBM PC /AT nepodporoval DMA a vyžadoval instrukce REP INSW/REP OUTSW k odeslání všech I/O dat disku přes port 0x1f0.
Na počátku 90. let se disky MFM/RLL přestaly používat („vymřely“) a nahradily je disky IDE , ale rozhraní registru softwaru k řadiči se nezměnilo.
Nízký výkon takového řadiče se stal vážným problémem, zejména na systémech PCI . Kromě nutnosti několika cyklů PCI k přenosu každých dvou bajtů dat to vedlo k zatěžování procesoru I/O disku .
K vyřešení tohoto problému řada společností, včetně Intelu , vyvinula řadiče IDE s podporou DMA. Řadiče byly a stále jsou softwarově nekompatibilní mezi různými výrobci, i když kompatibilita všech Intel IDE/ATA/SATA zdola nahoru je víceméně podporována.
Charakteristickým rysem této podpory je také použití nových příkazů protokolu IDE/ATA, což znamená požadavek na podporu DMA nejen řadičem, ale i samotným pevným diskem .
Kolem roku 2000 se vyvinula podpora DMA přes sběrnici IDE/ATA, aby se zvýšila rychlost sběrnice, což vyžadovalo nový typ kabelu od řadiče k jednotce s dvojnásobným počtem menších vodičů. Tato technologie se nazývala „Ultra DMA“ ( UDMA ).
Mnoho operačních systémů vyžadovalo pro použití IDE DMA akci správce. Takže například standardní linuxová jádra zhruba do roku 2004 takovou podporu neměla, bylo nutné jádro znovu sestavit s upraveným konfiguračním souborem.
V rodině operačních systémů Windows se podpora pro IDE DMA poprvé objevila pouze pro Intel v servisních balíčcích pro Windows NT 4 a vyžadovala ruční úpravu registru na většině systémů , aby byla povolena.
Ve Windows 2000 tento požadavek zmizel, ale existoval požadavek, aby i nespouštěcí disky byly uvedeny a nastaveny na DMA v BIOSu . Tato nastavení byla viditelná pro jádro operačního systému prostřednictvím technologie ACPI a operační systém neumožňoval povolení DMA pro disk, který není uveden v seznamu disků BIOS . Pro srovnání, Windows NT 4 podporoval jak vlastní velikost disku, tak DMA bez uvedení disku v BIOSu .
V Linuxu lzehdparm příkaz (viz níže ) použít k ručnímu povolení nebo zakázání IDE DMA . Moderní verze jádra automaticky povolují režim DMA, který lze vidět v ladicích zprávách (řádky jako "ata1.00: nakonfigurováno pro UDMA/133" nebo "hda: vybrán režim UDMA/33").
hdparm -i /dev/sda
… | M Byte / s | … |
---|---|---|
Režim 0 | 16.7 | UDMA16 |
Režim 1 | 25.0 | UDMA25 |
Režim 2 | 33.3 | UDMA33 |
Režim 3 | 44.4 | UDMA44 |
Režim 4 | 66,7 | UDMA66 |
Režim 5 | 100,0 | UDMA100 |
Režim 6 | 133,3 | UDMA133 |