Otsemällupöördus

Otsemälupöördumised (inglise keeles *Direct Memory Access* ehk *DMA*) on moodus suurte andmeplokkide kandmiseks seadmest muutmällu (ka vastupidi) ilma protsessori vahelesegamiseta.

Otsemälupöördumisteta kasutades programmeeritavat sisend/väljundit on protsessor täielikult hõivatud kogu lugemis- või kirjutamisprotsessi vältel, suutmata teha samaaegselt muid toiminguid.

Otsemälupöördumistel on juhtimisahel nimetusega *DMA controller*, mis annab mälu jaoks aadressi, edastab siinile tarvilikud juhtsignaalid, suurendab vajadusel mäluaadressi ning peab arvet ülekantud andmete kohta. *DMA controller* peab olema protsessori poolt käivitatava programmi kontrolli all. Enne otsemälupöördumisi annab protsessor andmete suuna, sõnade arvu andmeplokis ning ülekande suuna. Seejärel teostatakse ülekanne vastavalt antud korraldustele ning protsessor võib samal ajal teostada teisi toiminguid, väljakutsunud programm aga mitte. Pärast andmeploki ülekandmist saadab *DMA controller* katkestussoovi, kust edasi töötleb protsessor saadud andmeid. Sisend/väljundoperatsioonid toimuvad operatsioonisüsteemi kontrolli all, mis vastavalt jagab protsessoriressurssi erinevateks toiminguteks. Otsemälupöördumised on laialdaselt riistvaraseadmetes kasutusel, näiteks helikaartides, videokaartides, kõvaketta kontrollerites ning võrguadapterites.

DMA-d saab kasutada ka mälust-mällu kopeerimisel või liigutamisel mälu sees. DMA suudab suures koguses faile teisaldada näiteks puhvermälust andmevoogu.

## Tööpõhimõtted

### DMA
DMA kasutab DMA kontrollerit, mis võib luua mäluaadresse ning algatada lugemis- ja kirjutamisprotsesse. Need sisaldavad registreid, kuhu saab kirjutada ja lugeda protsessori poolt, sealhulgas mäluaadressiregister, baidiarvuregister ning lisaks üks või mitu kontrollregistrit. Registrid näitavad algset allikat, sihtkohta ning toimingud (lugemine või kirjutamine sisend/väljund seadmest), andmete suurust ning baidihulka, mida ühekorraga edastada. Sisendi, väljundi või mälust-mällu lugemiseks protsessor lähtestab DMA kontrollerile sõnade saatmise hulga ning mäluaadressi. Seejärel saadab protsessor välisseadmesse käsud, mille DMA kontroller annab seadme mälust. Iga kord, kui bait andmeid on valmis saatmiseks, DMA kontroller suurendab mäluregistrit, kuni kogu andmeplokk on saadetud.

### Siinihaldus
Siinihaldussüsteemis võivad nii protsessor kui ka välisseadmed saada kontrolli siini üle. Kui välisseadmed saavad siinihalduriteks (inglise keeles *bus master*), siis on võimalik otse kirjutada süsteemimällu ilma protsessori sekkumata, tagades vajadusel omale mäluaadressi ning võimaldades omavahelise suhtluse ja andmevahetuse. Kuigi teoorias valdab üks välisseade siini, siis praktikas on neil kõigil samaaegselt õigused.

### Andmeülekandetüübid
Failiülekanne võib toimuda bait korraga või terve andmeploki kaupa *burst mode*'is. Kui ülekanne toimub baidi kaupa, siis protsessor ja DMA vahetavad omavahel juurdepääsu mälule (*cycle stealing*). *Burst mode*'is on DMA kontrolleril eelisõigused mälule ning jätab protsessori ootama, kuni kogu andmeplokk on üle kantud. Lubatud on ka DMA kontrolleri ning protsessori läbipõimitus, kus DMA kontroller saab mälu kasutada ning protsessor mitte.

## Toimimisviisid

### Tsüklivargus
Tsüklivarguses (inglise keeles *Cycle stealing*) on protsessori ja DMA kontrolleri mälu poole pöördumised on ühtsed ning DMA kontrolleri soov siini kasutada on alati kõrgema prioriteediga. Lisaks sellele on kõrge prioriteediga seadmed võrgukaardid, kettad ning graafikakaardid. Pärast ühte baiti andmeülekandeid muudetakse siini automaatselt DMA kontrolleri ja protsessori vahelt, kuni kõik andmed on üle kantud. Sellest tuleneb ka nimetus "*Cycle stealing*", kus DMA kontroller nii-öelda varastab mäluga suhtlemise tsükleid. Antud meetod vähendab maksimaalset sisend-/väljundsignaalide ülekannet. Lisaks sellele on vähendatud DMA kontrolleri häireid protsessori-mälu suhtluses. Meetod on eriti kasulik kontrollerites, mis jälgivad reaalajas sisenevaid ja väljuvaid andmeid.

### ''Plokk- või valangrežiim''
Plokk- või valangrežiimimeetodiga (inglise keeles *block or burst mode)* on DMA kontrolleril võimalus andmeplokk korraga edastada, protsessor on samaaegselt vabastatud seadmete pöördumisest. Kasutatakse näiteks kettaseadmetes, mis vajavad andmete kiiret ja täieliku ülekannet. Probleemideks on protsessori ooteaeg, enne kui avaneb võimalus andmetöötluseks ning mitme seadme soov korraga siini kasutada.

### Läbipaistev laad
Läbipaistvas laadis (inglise keeles *Transparent mode*) on DMA liides on välja töötatud nii, et DMA kontroller suhtleb mäluga siis, kui protsessoril pole tarvis mäluga suhtlemise tsükleid. Peetakse üldplaanis kõige kiiremaks meetodiks, sest protsessor ei pea oma programme sulgema. Negatiivseks pooleks on riistvara keerukus ning hind hetkete tuvastamiseks, millal protsessor ei suhtle mäluga. Lisaks sellele on andmeedastus aeglasem kui eelneval kahel meetodil.

## Vahemälu sidusus

DMA võib tekitada vahemälu sidususe probleeme. Olukorras, kus on protsessor koos vahemäluga ning kõvaketas, mis saab DMA abil seadmetele ligi, saab protsessor andmed kohast X ning salvestab selle vahemällu. Kõvakettal muudetakse kohas X mäluandmed ära, kuid protsessor saab jätkuvalt vahemälus olevaid andmeid, mida pole uuendatud. Sama probleem on ka vastupidise olukorraga, kus vahemälu muudetakse, kuid see muutus ei kajastu lõpuks kõvakettal.

Selliste olukordade vältimiseks tuleb luua sidusa vahemäluga süsteem, kus antakse vahemälukontrollerile märku, kui on toimunud väline kirjutamine DMA poolt või vahemälu puhastamine pärast igat DMA lugemist. Mittesidusates süsteemides hoolitseb selle eest operatsioonisüsteem (OS), et enne DMA väljaminevat voogu on vahemälu puhtaks tehtud või uuendatud sissetuleva DMA voole ligipääsu. Samuti hoolitseb OS selle eest, et miski muu ei saaks samal ajal andmetele ligi. Selle kaudu küll DMA töötlusaeg pikeneb, sest tuleb läbi töödelda kogu vahemälu.

Leidub ka hübriidseid versioone, kus L2-vahemälu on sidus ja L1-vahemälu juhib tarkvara.

## Näited

### '''Harustandard-arhitektuuri siin'''
Originaalses IBM PC oli ainult üks Inteli 8237 võimeline pakkuma nelja DMA kanalit (0–3) osana harustandard-arhitektuuri siinist ehk ISA siinist (inglise keeles *Industry Standard Architecture* ehk ISA). IMB PC/AT tulekuga lisandus ka teine DMA kontroller (5–7, kanal 4 oli mõeldud kaskaadkanalina esimese 8237 kontrolleri jaoks), leheküljeregister oli ühendatud 16 MB aadressruumi külge. Teine kontroller sooritas 16-bitiseid ülekandeid.

Kasina jõudluse (2,5&nbsp;Mbit/s) tõttu asendusid need seadmed 80386 protsessoritega 1985. aastal, mis võimaldasid juba 32-bitiseid ülekandeid. Ainus pärandriistvara, mis kasutab ISA DMA ning on kasutuses on Super I/O seadmed, millel on sisseehitatud flopiseadme kontroller, infrapunakontroller ning IEEE 1284 tugi.

Igal DMA kanalil oli 16-bitine aadressiregister ning 16-bitine loendiregister, mis andmevahetusel paneb mõlemad valmis koos andmeülekandesuunaga ning antakse alustuskäsk. Ülekande lõppedes nõuab uuesti protsessorilt tähelepanu.

*Vectored I/O* laseb mitmest mälukohast teisaldada andmed ühte kohta, mis on samaväärne mitme lihtsa DMA soovi kokkupanekuga ning ülesannete kopeerimisega protsessorist.

Standard ISA DMA ülesanded:
# DRAM värskendus (vananenud),
# Kasutaja riistvara, tavaliselt 8-bitine DMA helikaart
# Flopiseadme kontroller
# Kõvaketas (vananenud programmeeritava sisendi/väljundi laadil ning vahetatud UDMA vastu), paralleelport (ECP toega pesa)
# Kaskaad XT DMA kontroller,
# Kõvaketas (PS/2 ainult) või valikuline riistvaraseadme võimalus
# Riistvaraseadme võimalus
# Riistvaraseadme võimalus

### PCI
Erinevalt ISA-st pole PCI-l keskkontrollisüsteemi. Selle asemel saavad nad küsida õigusi PCI siinihaldurilt (tavaliselt arvutitel lõunasillas) siini üle ehk saada siinihalduriks ning küsida õigusi mälust lugemisele ja kirjutamisele. Lõunasilla kaudu otsustatakse, millisele seadmele antakse siinihalduri õigused, sest korraga võib ainult ühel olla. Kui riistvaraosale anti õigused, siis see teostab lugemis- ja kirjutamiskäske edastades need mäluhaldurile kasutades spetsiifilisi käske vastavalt seadmete kiibistikule. Muutmälu jääb alati alluvaks, siinihaldur on alati ülem. Võimalik siinihaldurit mitmel viisil valida: 
* *Centralized arbitration* – üks seade (*bus arbiter*) otsustab, kes on järgmine siinihaldur 
* *Distributed arbitration* – kõik seadmed osalevad uue siinihalduri valimises
AMD Socket AM2 baasil arvutil suunab lõunasild käsud üle põhjasillale (integreeritud protsessori kiibi külge) kasutades HyperTransporti, mis muudab need DDR2 talitusteks ning saadab need DDR2 mälusiinile. PCI seade või PCI siin on aeglasemad kui muud komponendid, seetõttu tulebki need viia läbi pika teekonna. x86 protsessor võib kasutada 4 GB rohkem mälu kasutades PAE (*Physical Address Extension*), 36-bitist adresseerimist või X86-64 protsessorit. DAC (*Double Address Cycle*) tehnoloogiat kasutades nii PCI-siinil kui ka seadmel endal lubab 64-bitist adresseerimist.

### I/OAT
I/OAT (*I/O Acceleration Technology*) on DMA mootor, mida kasutatakse Intel Xeoni kiibistikes, mis vabastab protsessori kopeerides andmed ümber ning võimaldades sellel teha muid toiminguid. Peamine kasutusala on võrgu kiirendamine, kui kasutatakse ka teisteks otstarveteks.

### DDIO
DMA-le jõudlusuuendusi DMA mehhanismile on tehtud Intel Xeon E5 protsessorites DDIO (*Data Direct I/O*) lisamisega, mis kasutab vahemälu (20 MB) muutmälu asemel. Selle tulemusena kasutatakse vahemälu kui peamise allika ning sihtkohana I/O seadmete jaoks, lubades võrguadapteril suhelda otse võrgus olevate protsessoritega, säästes aega muutmälust vastuste saamisest. Selle tulemusena lüheneb latentsusaeg, laseb I/O seadmetel täielikult vahemälus toimetada, kaotab RAM-i ribalaiusega seotud pudelikaelaefekti ning vähendab voolutarvet sellega, et RAM jääb madala koormusega faasi.

## Vaata ka
* PCI-siin
* Põhjasild
* Lõunasild
* Sisend/väljund
* Muutmälu
* Vahemälu

## Viited