Přeskočit na obsah

DMA

Z Wikipedie, otevřené encyklopedie

DMA (Direct Memory Access), přímý přístup do paměti) je v informatice způsob přímé komunikace hardwarového subsystému počítače s operační pamětí. Protože komunikace s pamětí neprobíhá pomocí procesoru, může procesor vykonávat jinou činnost. DMA je používá například řadič pevných disků, grafická karta, síťová karta, zvuková karta a jiné komponenty s intenzivním přenosem dat. DMA je odchylkou od Von Neumannovy architektury počítače.

Princip

Klasická komunikace se vstupně-výstupními zařízeními je realizována pomocí strojových instrukcí IN (přenáší data ze zařízení do registru procesoru) a OUT (přenáší data z registru procesoru do zařízení), které tyto data (typicky slovo procesoru) přenášejí po datové sběrnici a adresní sběrnice přitom slouží k adresaci vstupně-výstupního zařízení (tzv. PIO přenosy). Z hlediska procesoru jsou vstupně-výstupní zařízení velmi pomalá a procesor musí na reakci zařízení čekat, což velmi zpomaluje výpočetní rychlost počítače.

DMA je řízené speciálním řadičem, který je připojen na základní desku počítače. Přenášení velkých objemů dat mezi vstupně-výstupními zařízeními a operační pamětí je pak řízeno DMA řadičem a procesor je brzděn těmito přenosy jen částečně (při blokování sběrnice konfliktem přístupů do paměti) a může vykonávat jinou činnost. Počítač tak má z hlediska uživatele větší výkon. Program nejprve řadič DMA naprogramuje (pomocí několika instrukcí IN a OUT) a o další přenosy se již nemusí programátor starat. Dokončení přenosu může být signalizováno přerušením, které aktivuje obsluhu přerušení, která může naprogramovat řadič DMA na další přenosy.

Řadič DMA je v počítačích IBM PC kompatibilních svázán se sběrnicí ISA a je typicky součástí čipové sady. Pro sběrnici PCI se DMA řadič již nepoužívá. Místo něho je využit princip bus masteringu, kdy řízení přenosu dat převezme zúčastněné zařízení připojené do PCI sběrnice.

Implementace pro sběrnici ISA

DMA řadič má pro sběrnici ISA 16 kanálů, z toho sedm dostupných pro procesor počítače. Každý kanál má přiřazen 16bitový adresový registr a 16bitový čítač. Pro zahájení přenosu musí ovladač konkrétního zařízení nastavit tyto registry spolu se směrem toku dat - zápis nebo čtení. Poté řadič požádá zařízení o provedení přenosu. Jakmile je přenos dokončen, zařízení vyvolá přerušení.

Tzv. scatter-gather DMA umožňuje přenést data do nebo z několika částí paměti v jedné DMA operaci. Lze to přirovnat k provedení několika jednoduchých DMA operací za sebou. Důvodem je snížení počtu vstupně/výstupních operací, ve kterých by musel procesor DMA řadič opakovaně programovat.

Problémy

Protože DMA obchází standardní postupy uvnitř počítače, přináší DMA potíže, se kterými musí konstrukce a programátor počítat.

Koherence vyrovnávací paměti

DMA může způsobovat problémy s tzv. paměťovou koherencí. Představte si procesor vybaven pamětí cache a externí pamětí, která je přístupná zařízením používající DMA. Když procesor načte pozici X z paměti, bude načtena i do vyrovnávací paměti cache. Následné operace na X aktualizují X ve vyrovnávací paměti, ale nezmění X v externí paměti. Pokud se však před dalším přístupem zařízení na pozici X v externí paměti neaktualizuje tato hodnota z cache, zařízení přistupující na tuto hodnotu přes DMA obdrží původní hodnotu X. Podobně pokud hodnota X v cache není aktualizována, jakmile je změněna hodnota v paměti zařízením skrze DMA, po té bude procesor pracovat se starou hodnotou X.

Paměťová koherence
Paměťová koherence


Paměť nad 4 GB

Moderní x86 procesory jsou pomocí rozšíření PAE nebo 64bitového režimu schopny adresovat více, než 4 GB paměti. To však způsobuje některým zařízením s DMA problém, protože používají jen 32bitovou adresu, a tak je pro ně paměť nad hranicí 4 GB nedostupná. Nicméně v takzvaném dvojnásobném adresovacím módu (DAC) lze nadvakrát přenést po 32bitové PCI sběrnici 64bitovou adresu a je tedy možné adresovat teoreticky až 16 EB paměti.

Virtuální adresy

Moderní procesory používají adresaci virtuální paměti, kdy strojové instrukce procesoru používají logické adresy, které jsou MMU jednotkou uvnitř procesoru překládány na fyzické adresy v paměti RAM. Tato situace bohužel vede k tomu, že řadič DMA pracuje s fyzickými adresami a ne s logickými adresami, jaké používají spuštěné procesy a jádro operačního systému. Proto je poměrně komplikované zajistit přenosy pomocí DMA, které pracují s pamětí o velikosti větší, než je velikost stránky paměti (typicky 4 KiB RAM), protože je nutné zajistit úsek paměti, který je souvislý i ve fyzické paměti (aby přenos pomocí DMA řadiče mohl být nepřerušený).