Közvetlen memória hozzáférés

Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt közreműködők, és jelentősen eltérhet a 2021. október 31-én felülvizsgált verziótól ; az ellenőrzések 8 szerkesztést igényelnek .

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ő.

Munka leírása

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.

Busz mastering

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.

DMA és virtuális memória , IOMMU és AGP GART

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.

  1. Az egymást követő fizikai memória lefoglalása az operációs rendszer kernelében és az összes adat közbenső másolása oda/onnan (az úgynevezett "bounce buffer" - angol  bounce buffer ).

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:
  1. Egy művelet felosztása részműveletekre az SGL elemhatárai mentén , minden művelet végén egy szünettel.

A HP ScanJet típusú lapolvasókkal együtt szállított régebbi 8 bites SCSI -vezérlőkben használatos .

Hibák:
  1. Maga az eszköz támogatja az SGL -t, azzal a feltétellel, hogy az eszközspecifikus formátumra konvertált SGL -t át kell másolni az eszközre az eszköz regisztereihez való többszöri hozzáféréssel.
Hibák:
  1. Maga az eszköz támogatja az SGL -t azzal a feltétellel, hogy az eszközspecifikus formátumra konvertált SGL -t a fő memória fizikailag egybefüggő régiójában kell elhelyezni.

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:
  1. Az SGL támogatása interbus hardverben, ahol az eszközoldalon egy fizikailag burst puffer ábrázolása fizikailag szomszédosnak tűnik.

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:

DMA és IDE/ATA, Ultra DMA

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").

ATA Protocol Ultra DMA módok Linux operációs rendszerhez

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

Lásd még

Jegyzetek

  1. z/OS Communications Server | Közvetlen távoli memóriaelérés konvergens Etherneten keresztül (utoljára frissítve a V2R1-ben) . Letöltve: 2019. augusztus 3. Az eredetiből archiválva : 2019. augusztus 3..

Linkek