DMA

Z Wikipedie, otevřené encyklopedie
Skočit na: Navigace, Hledání
Tento článek pojednává o přímém přístupu do paměti. O dimethylaminu (DMA; chemická sloučenina) pojednává článek Dimethylamin.

DMA (anglicky Direct Memory Access, tj. přímý přístup do paměti) je v informatice způsob přímého přenosu dat mezi operační pamětí a vstupně/výstupními zařízeními. Data neprocházejí skrze procesor a lze tak dosáhnout vyššího výkonu (během přenosu dat může procesor zpracovávat jiné strojové instrukce). DMA se používá pro přenos větších objemů dat například řadič pevných disků, grafická karta, síťová karta, zvuková karta a podobně. DMA je odchylkou od Von Neumannovy architektury počítače.

Princip[editovat | editovat zdroj]

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é tato 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 součástí základní desky 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 díky paralelizaci (současnému vykonávání) přenosů dat a činnosti procesoru. 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.

Implementace DMA[editovat | editovat zdroj]

DMA je obecný princip. V různých počítačích je různě implementován. Pokud se mluví o DMA v souvislosti s počítači IBM PC kompatibilními, míní se obvykle speciální DMA řadič pro ISA sběrnici.

Pro sběrnici ISA[editovat | editovat zdroj]

V počítačích IBM PC kompatibilních byl pro přímé přenosy dat mezi pamětí a vstupně-výstupními zařízeními společně se sběrnicí ISA používán programovatelný obvod Intel 8237 (označována jako řadič DMA). Původně býval samostatným integrovaným obvodem na základní desce, později byl součástí čipové sady. Tento 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č.

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.

Pro sběrnici PCI[editovat | editovat zdroj]

Pro sběrnici PCI již původní řadič DMA není používán (jak byl obvod Intel 8237 navržen pro spolupráci s ISA sběrnicí). Místo něho je využit princip bus masteringu, kdy jedno ze vstupně-výstupních zařízení připojených k PCI sběrnici převezme řízení přenosu dat. Přenášet lze nejen data mezi zařízením a operační pamětí, ale i vzájemně mezi zařízeními (např. mezi síťovými kartami), čímž je přenos dat významně urychlen (není nutné data přenést nejprve ze zařízení do operační paměti a pak zpět do jiného zařízení).

Problémy[editovat | editovat zdroj]

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[editovat | editovat zdroj]

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, poté bude procesor pracovat se starou hodnotou X.

Paměťová koherence.


Paměť nad 4 GiB[editovat | editovat zdroj]

Moderní x86 procesory jsou pomocí rozšíření PAE nebo 64bitového režimu schopny adresovat více, než 4 GiB 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 GiB 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 EiB paměti.

Virtuální adresy[editovat | editovat zdroj]

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