Vyšlo v týdeníku Computerworld č. 25/93 v roce 1993
Vytištěno z adresy: http://www.earchiv.cz/a93/a325c120.php3

DMA

Přenášet data uvnitř počítače, mezi jeho jednotlivými částmi, nemusí být vždy úplně jednoduché. Různá periferní zařízení totiž mohou mít dosti specifické požadavky na to, jak rychle jim mají být data poskytována (při výstupních operacích), resp. jak rychle mají být od nich přebírána (v rámci vstupních operací). Vezměme si jako příklad pevný disk : kotouče, na kterých jsou v soustředných stopách zaznamenány jednotlivé sektory, se otáčí konstantní rychlostí. Tou je pak jednoznačně určena i rychlost, jakou musí být zapisovány, resp. čteny jednotlivé datové bity. Diskový řadič z těchto bitů sestavuje celé byty a slova a opět má jednoznačně určeno, jak rychle bude jednotlivé byty produkovat (při čtení), resp. jak rychle je potřebuje dostávat (při zápisu na disk). Diskový řadič sice může být vybaven určitým objemem vyrovnávací paměti, která dokáže po jistou dobu hromadit čtená data, ale v obecném případě je nutné odebírat od diskového řadiče čtená data a přenášet je do operační paměti rychlostí, odvozenou od rychlosti otáčení disku. Zcela analogicky to platí pro případ zápisu na disk.

Kdyby měl být přenos dat mezi řadičem disku a operační pamětí zajišťován procesorem, mohlo by se stát, že by to ani při nejlepší vůli nedokázal "stíhat". Proč?

Činnost procesoru je řízena strojovými instrukcemi, které procesor sám načítá z operační paměti. I kdyby byl procesor vybaven strojovou instrukcí, která přenáší data z paměti rovnou do vstupně-výstupních registrů (V/V bran, portů) periferních zařízení, resp. naopak, musel by ji procesor vždy nejprve sám načíst z paměti - na přenesení každého bytu "užitečných dat" by tak ve skutečnosti bylo nutné přenést hned několik bytů (tvořících strojovou instrukci) z paměti do procesoru. A to by byla režie, kterou by bylo nutné měřit ve stovkách procent! Některé procesory sice mají takové strojové instrukce, které dokáží přenášet postupně celé bloky dat (v rámci jediné instrukce), ale ty se zase nedokáží přizpůsobit rychlosti požadované diskovým řadičem. Proto se takovéto instrukce používají pro přesuny bloků jen v rámci paměti.

Je zde však ještě jeden zajímavý moment: žádná strojová instrukce nikdy nemůže přenést byte (slovo, dvojslovo) ze zadaného vstupně-výstupního registru na zadanou adresu do paměti přímo - vždy to musí být "nadvakrát": nejprve z V/V registru do procesoru (do některého jeho pomocného registru, který je jinak pro uživatele neviditelný) a odsud, ještě v rámci téže instrukce, do paměti (analogicky pro obrácený směr). Důvod je jednoduchý: adresová sběrnice je jen jedna, a nelze ji tedy využít pro adresování dvou míst současně. Takže i kdyby režie na načítání strojových instrukcí byla nulová, procesor nikdy nedokáže využít maximální možnou rychlost přenosu dat po datové sběrnici lépe než na polovinu.

Otázkou ovšem je, zda by tuto maximální rychlost nedokázal využít někdo jiný než procesor a jak.

Jedinou možností, jak "obejít" procesor a zajistit přenos dat po adresové sběrnici z paměti přímo do V/V registru resp. naopak, je využít adresovou sběrnici pro adresování jednoho účastníka přenosu (nejspíše paměti), a druhého adresovat jiným způsobem. Teprve pak je možné implementovat techniku, které se příznačně říká Direct Memory Access (zkratkou DMA), česky: přímý přístup do paměti.

U mikroprocesorových systémů má realizaci této techniky na starosti specializovaný obvod, tzv. řadič přímého přístupu do paměti (DMA-řadič). Jeho úkolem je tedy zajišťovat přenos dat po datové sběrnici přímo mezi vstupně-výstupními zařízeními a pamětí, bez dočasného ukládání těchto dat kdekoli v pomocných registrech a bez účasti a bez zprostředkování procesorem.

Má-li ovšem DMA řadič zajistit takovýto přímý přístup do paměti, musí umět ovládat operační paměť - posílat jí adresy po adresové sběrnici a generovat nezbytné řídicí signály, jež jsou předávanz po řídicí sběrnici. Kromě toho se DMA-řadič musí umět také dohodnout s procesorem, protože v daném okamžiku může i procesor chtít pracovat s pamětí. Nejčastější řešení je takové, že o využití paměti rozhoduje procesor a DMA-řadič v okamžiku skutečné potřeby žádá procesor o přidělení sběrnic a s nimi o právo přístupu k paměti. Jakmile procesor této žádosti vyhoví, stává se DMA-řadič výlučným pánem paměti a všech sběrnic a může zprostředkovat přímý přenos dat mezi V/V zařízením a pamětí. Po jeho skončení pak zase vrací sběrnice (a s nimi i paměť) zpět procesoru.

V praxi jsou DMA-řadiče tvořeny několika samostatnými kanály, z nichž každý je pevně vyhrazen určitému zařízení - proto, aby jej mohl adresovat již dříve naznačeným "jiným způsobem". Ten spočívá v tom, že mezi zařízením a jemu vyhrazeným kanálem DMA-řadiče vedou dva signály: jedním zařízení signalizuje svou připravenost a žádá o zprostředkování přenosu dat z pamětia do ní a druhým kanál DMA-řadiče odpovídá na tuto výzvu.

Přesný postup je následující: zařízení, které chce iniciovat přenos dat v rámci přímého přístupu do paměti, nejprve požádá "svůj" kanál DMA řadiče (příslušným signálem). DMA řadič pak požádá procesor o přidělení sběrnic. Jakmile mu procesor vyhoví, příslušný kanál DMA řadiče vyšle na adresovou sběrnici adresu (patřící paměti!) a vygeneruje potřebné řídicí signály pro paměť (požadující čtení, resp. zápis). Kanál zároveň Současně s tím odpoví vstupně-výstupnímu zařízení na jeho žádost, a tím jej současně vyzve k umístění dat na datovou sběrnici ( při přenosu směrem do paměti), resp. k jejich převzetí z této sběrnice (v případě přenosu opačným směrem).

DMA řadič přitom může pracovat v různých režimech - může zajišťovat jednotlivé přenosy, tedy po každém jednotlivém přístupu do paměti zase sběrnice vrátit procesoru, nebo si je může ponechat tak dlouho, dokud je co přenášet. Tímto způsobem pak dokáže skutečně využít maximální možnou rychlost přenosu dat po datové sběrnici.

Zde je však dobré si zdůraznit ještě jeden moment. DMA řadič není řízen programem, resp. strojovými instrukcemi, a nemá tudíž režii, která by připadala na načítání z paměti. Je to jednoúčelové zařízení optimalizované právě a pouze na zajištění přímého přístupu do paměti. Každý kanál potřebuje ke své činnosti v podstatě jen tři údaje: kolik dat má přenést, kterým směrem a z kterého, resp. ze kterého místa v paměti (tj. od jaké počáteční adresy). Program, který iniciuje nějakou vstupně-výstupní operaci, musí tyto údaje zapsat do řídících registrů příslušného kanálu DMA-řadiče.