Közvetlen memóriaelérés ( közvetlen memóriaelérés , DMA ) - olyan adatcsere mód számítógépes eszközök között vagy egy eszköz és a fő memória között, amelyben a központi feldolgozó egység (CPU) nem vesz részt. Mivel nem küldenek adatokat a CPU-ra és onnan, az átviteli sebesség megnő.
Ha meg kell töltenie az egymást követő címeken található memóriacellákat , használja a "burst" ( eng. burst ) busz üzemmódot:
A CPU hasonló optimalizálása memóriával rendkívül nehéz.
Az IBM PC eredeti architektúrájában ( ISA busz ) a DMA csak hardveres DMA-vezérlővel ( Intel 8237 chip ) volt lehetséges.
A DMA vezérlő a CPU-tól függetlenül hozzáférhet a rendszerbuszhoz , és számos regiszterrel rendelkezik . A DMA vezérlőregiszterek a CPU számára elérhetők olvasáshoz és íráshoz, és a következők beállítására szolgálnak:
Fontolja meg az adatok eszközről történő beolvasásának folyamatát. A CPU értékeket ír a DMA vezérlő regisztereibe, parancsot küld az eszköznek (például egy lemeznek) az adatok olvasásához. A készülék adatokat olvas (például lemezről) és ír a belső memóriájába (puffer). A DMA vezérlő beállítja a PC memória címét a címbuszon , kérést küld a készüléknek, hogy olvassa be az adatokat a készülék belső memóriájából (pufferéből). A készülék kérést kap, és azt sem tudja, hogy a kérés a CPU-tól vagy a DMA vezérlőtől érkezett. Az eszköz a következő szót a belső memóriájából (pufferből) a PC RAM-jába küldi a címbuszon található címre . A készülék ezután jelet küld a DMA vezérlőnek, jelezve a felvétel végét. A DMA vezérlő megnöveli a PC memória címét és ráhelyezi a címbuszra , csökkenti a bájtszámláló értékét, és ismét kérést küld az eszköz belső memóriájából (pufferéből) az adatok olvasására. A ciklus addig ismétlődik, amíg a számláló értéke nulla nem lesz. A ciklus lejárta után a készülék processzormegszakítást kezdeményez , jelezve az adatátvitel befejezését.
A több művelet párhuzamos végrehajtására képes DMA vezérlőt többcsatornásnak nevezzük.
A MicroChannel busz , az SBus , amelyet erősen befolyásol a PCI és annak fogalmi származékai, az AGP és a PCI-X , a DMA eltérő megvalósítását használja. Ezek a buszok lehetővé teszik, hogy bármely eszköz bejelentse a busz lefoglalásának szükségességét, ezt az igényt az ún. választottbíró az első adandó alkalommal kielégíti. A buszt sikeresen rögzítő eszköz önállóan beállítja a címet és a vezérlőjeleket a buszon, és egy ideig ugyanazt a vezető szerepet tölti be a buszon, mint a CPU. Ekkor a CPU hozzáférése a buszhoz egy pillanatra le van tiltva.
Egy ilyen DMA megvalósításban nincs DMA vezérlő és nincs DMA vezérlő bejegyzés száma.
Néhány régebbi PCI -eszköz , nevezetesen a Sound Blaster család hangkártya- megvalósításai az eredeti IBM PC architektúra 8237 DMA-vezérlőjét használták . Ez a használat minden bizonnyal elavult a PCI -nél , de megmaradt annak érdekében, hogy teljes szoftver- és illesztőprogram -kompatibilitást biztosítson a Sound Blaster hangkártyákkal az ISA-buszhoz .
Ezt a támogatást "Distributed DMA"-nak (D-DMA) hívják, és mind az eszközben, mind a PCI - ISA híd logikájában hardveresen implementálva van, amelyben a 8237 DMA vezérlő logikája (eredeti az IBM PC -hez ) PCI rendszereken is található . A megvalósítás két kérést használ: az első kérés az eszköztől a PCI-ISA hídhoz, a második a hídtól a PC RAM -hoz érkezik.
Az említett Sound Blaster -megvalósításokon kívül gyakorlatilag egyetlen PCI -eszköz sem használja a "DMA-vezérlő belépési száma" fogalmát, és a 8237 sem.
Lapozott virtuális memóriával rendelkező operációs rendszereken , mint például a Windows és a UNIX család , a virtuális címek egybefüggő régiója megvalósítható nem folytonos fizikai oldalakkal.
A DMA végrehajtása egy ilyen régióban meglehetősen nagy kihívás. Szintén nehéz feladat a DMA végrehajtása a szállított memórián.
A probléma megoldásához szükség van a régiót megvalósító fizikai oldalak azonosítására, és ezek szállításának blokkolására a virtuális memória alrendszer elérésével. Továbbá lehetővé válik a régió oldalainak fizikai címeinek megtalálása, amelyek általában nem folyamatosak, és az úgynevezett "szórás-gyűjtő listát" ( angolul scatter-gather list , SGL ) alkotják.
A DMA ilyen listán való végrehajtásának feladata a következő módok egyikével oldható meg.
Az összes vezető operációs rendszer támogatja . A támogatás Windows rendszeren történő aktiválásához egy hívásra van szükség a paraméter beállításával . IoGetDmaAdapterDEVICE_DESCRIPTION::ScatterGatherFALSE
Hibák:A HP ScanJet típusú lapolvasókkal együtt szállított régebbi 8 bites SCSI -vezérlőkben használatos .
Hibák:Az eszköz az SGL -t ugyanazzal a buszzárolásos DMA -mechanizmussal olvassa be , mint a tényleges adatokat, ezáltal megvalósítja egy olyan processzor funkcionalitását, amely beolvassa és végrehajtja saját „programját”, amely SGL -leírók listájaként van megvalósítva . Ezt az architektúrát "lánc-DMA"-nak ( eng. lánc DMA ) hívják, amelyet a modern számítógépek szinte minden szabványos berendezésében megvalósítanak - Intel IDE ( eng. integrált meghajtó elektronika ) (primitív formában), USB UHCI , USB OHCI , 1394 OHCI , valamint a legtöbb PCI , Ethernet és SCSI adapterben (még a régi AIC78xx is ). Az 1394 OHCI hardverspecifikáció jó példája ennek az architektúrának egy nagyon összetett és fejlett formában történő megvalósítására . Egyes jelentések szerint ezt a "csatornaprogramoknak" nevezett architektúrát már a Szovjetunióban ES számítógépekként ismert IBM 360 -ban használták .
Hibák:Az ilyen berendezéseket IOMMU -nak ( input/output memory management unit ) hívják . Mind a Sun Microsystems számítógépein megvalósították az SBus buszhoz , mind a DEC Alpha számítógépeihez a PCI buszhoz . Egészen a közelmúltig ezt szinte soha nem alkalmazták a hagyományos x86 /PCI rendszerekben, bár jelenleg van egy tendencia a helyzet megváltoztatására, főként a virtuális gépek hipervizorainak teljesítményének javítása érdekében . Mindig az AGP GART nevű AGP -buszhoz lett implementálva, hogy megkönnyítse a GPU véletlenszerű hozzáférését a fő memóriában található textúrákhoz . Eszköz oldalról ezt a hardvert az AGP specifikációja szabványosította , a szoftver oldalról pedig nem volt szabványosítás, a megvalósítás az AGP és a memória közötti northbridge chip gyártójától függött (ezért kellett egy " AGP driver ", mint például az Intel chipek esetében ). A kifejlesztett operációs rendszerek , például a Windows rendszermagjainak híváskészlete mindig is tartalmazta az IOMMU architekturális absztrakcióját ( és egyfajta IOMMU-ként értelmezett visszapattanó puffer is támogatja ezeket a hívásokat ), lehetővé téve, hogy ugyanaz az eszközillesztő támogassa, ha csatlakoztatva van. különböző IOMMU -kon keresztül . agp440.sys MapTransferGetScatterGatherList
Hibák:Az eredeti IBM PC /AT merevlemez-vezérlő nem támogatta a DMA-t, és REP INSW/REP OUTSW utasításokra volt szüksége ahhoz, hogy a lemez összes I/O adatát a 0x1f0 porton keresztül küldje el.
Az 1990-es évek elején az MFM / RLL meghajtók használaton kívül kerültek ("kihaltak"), helyükre IDE -meghajtók kerültek , de a szoftver regiszter interfésze a vezérlőhöz nem változott.
Egy ilyen vezérlő alacsony teljesítménye komoly problémává vált, különösen a PCI rendszereken . Amellett, hogy két byte-onként több PCI-ciklust kellett átvinni, ez a lemez I/O -jának betöltését eredményezte a processzorban .
A probléma megoldására számos vállalat, köztük az Intel is kifejlesztett DMA-támogatással rendelkező IDE-vezérlőket. A vezérlők szoftveresen inkompatibilisek voltak és továbbra is a különböző gyártók között, bár az összes Intel IDE/ATA/SATA kompatibilitás alulról felfelé többé-kevésbé támogatott.
Ennek a támogatásnak az egyik jellemzője az új IDE / ATA protokoll parancsok használata, ami azt jelenti, hogy nem csak a vezérlő, hanem maga a merevlemez is támogatja a DMA-t .
2000 körül az IDE/ATA buszon keresztüli DMA-támogatás a busz órajelének növelésére fejlődött ki, amihez új típusú kábelre volt szükség a vezérlőtől a meghajtóig, kétszer annyi kisebb vezetékkel. Ezt a technológiát "Ultra DMA"-nak ( UDMA ) hívták.
Sok operációs rendszer rendszergazdai beavatkozást igényelt az IDE DMA használatához. Így például a szabványos Linux kernelek kb. 2004-ig nem rendelkeztek ilyen támogatással, a kernelt újra kellett építeni egy szerkesztett konfigurációs fájllal.
A Windows operációs rendszer családban az IDE DMA támogatása először csak az Intel számára jelent meg a Windows NT 4 szervizcsomagjaiban, és a legtöbb rendszeren a rendszerleíró adatbázis kézi szerkesztését igényelte , hogy engedélyezze.
A Windows 2000 rendszerben ez a követelmény megszűnt, de előírták, hogy még a nem rendszerindító lemezeket is fel kell sorolni és be kell állítani DMA-ra a BIOS -ban. Ezek a beállítások az ACPI technológián keresztül láthatóvá váltak az operációs rendszer kernelje számára , és az operációs rendszer nem engedélyezte a DMA engedélyezését a BIOS lemezlistáján nem szereplő lemezeken . Összehasonlításképpen, a Windows NT 4 támogatja az egyéni lemezméretet és a DMA-t is anélkül, hogy a lemezt listázta volna a BIOS -ban .
Linuxon egy paranccsal (hdparm lásd alább ) lehet manuálisan engedélyezni vagy letiltani az IDE DMA-t . A modern kernelverziók automatikusan engedélyezik a DMA módot, ami a hibakeresési üzenetekben látható (például "ata1.00: UDMA/133-hoz konfigurálva" vagy "hda: UDMA/33 mód kiválasztva").
hdparm -i /dev/sda
… | M bájt / s | … |
---|---|---|
0. mód | 16.7 | UDMA16 |
1. mód | 25.0 | UDMA25 |
2. mód | 33.3 | UDMA33 |
3. mód | 44.4 | UDMA44 |
4. mód | 66.7 | UDMA66 |
5. mód | 100,0 | UDMA100 |
6. mód | 133.3 | UDMA133 |