Direct memory access

Kur numër i madh i të dhënave duhet të lëvizen, kërkohet mënyrë më efikase: direct memory access (DMA). DMA përfshin modul shtesë në sistemin e buseve. DMA moduli është i aftë të imitoj procesorin dhe të marr kontrollin e sistemit nga procesori. Ai duhet ta bëj këtë, në mënyrë që të dhënat të transferohen nga memorja në sistemin e buseve, ose anasjelltas. Për këtë qëllim, DMA moduli duhet të përdor buset vetëm atëherë kur nuk i nevoiten procesorit, ose të detyroj procesorin të suspendoj operacionet përkohësisht. Teknika e fundit është më e zakonshme.

## Principi i punës 
Kur procesori dëshiron të lexoj ose shkruaj një bllok të shënimeve, ai i dërgon një komandë  DMA modulit, duke ia derguar atij këtë informacion:
* Nëse lexim apo shkruarje është kërkuar, duke përdorur linjat e kontrollit për lexim apo shkrim mes procesorit dhe DMA modulit.
* Adresa e paisjes hyrëse/dalëse të përfshirë
* Lokacioni fillestar në memorje për të lexuar nga ai, ose për të shkruar në të, i komunikuar në linjën e shënimeve dhe i ruajtur nga DMA moduli në regjistrin e tij të shënimeve
* Numrin e fjalëve që do të lexohen ose shkruhen, përsëri të komunikuara përmes linjës së shënimeve dhe te ruajtura në regjistrin e shënimeve të DMA modulit

Procesori më pas vazhdon me punë tjera. Ai ia ka deleguar këtë operacion hyrës/dales DMA modulit. DMA moduli transferon të gjithë bllokun e shënimeve, nga një fjalë, direkt në memorje, ose nga ajo (pa shkuar përmes procesorit). Kur transferimi të përfundoj, DMA moduli dërgon një sinjal procesorit. Pra, procesori është i përfshirë vetëm në fillim dhe në fund të transferit.
Procesori do të suspendohet pak para se të ketë nevojë të përdorë buset. DMA moduli më pas transferon një fjalë dhe ia kthen kontrollin procesorit. Kjo nuk është ndërprerje; procesorit nuk i duhet të ruaj dhe të bëj dicka tjetër. Përndryshe, procesori pauzon për një cikël të buseve. Qëllimi është të detyroj procesorin të ekzekutoj më ngadalë. Megjithatë, për transfere hyrëse/dalëse  të disa fjalëve, DMA është më efikase.

## Modet e punës 
DMA mekanizmi mund të konfigurohet në disa mënyra. Në njërën ndër to, të gjitha modulet përdorin të njejtin sistem të buseve. DMA moduli, që zëvëndëson procesorin, përdor modul hyrës/dalës të programuar për të shkëmbyer të dhëna mes memorjes dhe një moduli hyrës/dalës përmes DMA modulit. Ky konfiguracion, edhe pse mund të jetë jo shumë i kushtueshëm, qartazi nuk është efikas, pasi që për çdo transfer të një fjalë përdoren dy cikle të buseve.
Ky numër  mund të shkurtohet duke përdorur DMA-në dhe funksionet hyrëse/dalëse. Kjo do të thotë se mes DMA modulit dhe një ose më shumë moduleve hyrëse/dalëse ekziston një rrugë që nuk përfshin sistemin e buseve. Logjika e DMA-se realisht mund të jetë pjesë e një moduli hyrës/dalës, ose mund të jetë modul i ndarë që kontrollon një ose më shumë module hyrëse/dalëse. Ky koncept mund të arrihet një hap më tutje duke lidhur modulet hyrëse/dalëse me DMA modulit, duke përdorur një bus hyrës/dalës. Kjo redukton numrin e ndërfaqeve hyrëse/dalëse në DMA modul në një dhe siguron një konfigurim lehtë të zgjerueshëm. Në të dyja këto raste, sistemi i buseve  që DMA moduli ndan me procesorin dhe memorjen përdoret nga DMA moduli vetëm për të shkëmbyer të dhëna me memorjen. Shkëmbimi i të dhënave mes DMA-së dhe moduleve hyrëse/dalëse kryhet jashtë sistemit të buseve.

## Intel 8237A DMA Kontrolluesi 
Intel 8237A DMA kontrolluesi përfshihet në familjen e 80x86 procesorëve dhe në DRAM memorje të siguroj kapacitetin e një DMA-je.  Kur DMA moduli ka nevojë të perdor sistemin e buseve (të dhena, adresë dhe kontroll) për të transferuar të dhëna, ai i dërgon procesorit një sinjal të quajtur HOLD.
Procesori përgjigjet me një HLDA (hold acknowledge) sinjal, duke konfirmuar që DMA moduli mund të përdorë buset. Për shembull, nëse DMA moduli dëshiron të transferoj një bllok të të dhënave nga memorja në disk, do të bëj këta hapa:
# Paisja periferike (si kontrolluesi i diskut) do të kërkoj shërbimin e DMA-së duke tërhequr DREQ (DMA kërkesën) lartë.
# DMA do të kthej një HRQ (hold request), duke sinjalizuar CPU-në përmes HOLD pineve që ka nevojë të përdorë buset. 
# CPU do të përfundoj ciklin aktual të buseve (jo domosdoshmërisht instruksionin aktual) dhe t’i përgjigjet kërkesës së DMA-së duke i japur prioritet HDLA (hold acknowledge), duke i treguar në këtë mënyrë 8237 DMA-së se mund të përdorë buset. HOLD duhet të mbetet aktiv për aq kohë sa DMA është duke kryer punë.
# DMA do të aktivizoj DACK (DMA acknowledge), që i tregon paisjes periferike që transferimi i të dhënave do të filloj.
# DMA fillon transferimin e të dhënave nga mermorja në periferi duke vendosur adresën e bitit të parë  të bllokut në busin e adresave dhe duke aktivizuar MEMR, në këtë mënyrë duke lexuar bitin nga memorja në busin e të dhënave; më pas aktivizon IOW për ta shkruar atë në periferi. Më pas DMA dekrementon numëruesin dhe inkremtenton adresën e pointerit dhe përsërit këtë proces, derisa numëruesi arrin vlerën zero dhe detyra përfundon.
# Pasi që DMA ka përfunduar punën e saj, ajo do të deaktivizoj HRW dhe sinjalizon CPU-në që mund të rimarr kontrollin e buseve.
8237 përmban 4 DMA kanale, që mund të programohen pavarësisht dhe secili nga këto kanale mund të aktivizohen në çfarëdo momenti. Këto kanale numërohen si 0, 1, 2 dhe 3.
8237 ka një set të 5 regjistrave të kontrolleve/komandave për të programuar dhe kontrolluar DMA operacionet.
* Command: Procesori ngarkon këtë regjistër të kontrolloj operacionet e DMA-së. D0 mundëson transferet memorje-memorje, kur kanali 0 përdoret për të transferuar një bajt në regjistrin e përkoheshem 8237 dhe kanali 1 përdoret për të transferuar bajtin nga regjistri në memorje. Kur transferi memorje-memorje mundësohet, D1 mund të përdoret të pamundesoj inkremtentimin/dekrementrimin në kanalin 0, ashtu që një vlerë fikse  të mund të shkruhet në një bllok të memorjes. D2 mundëson ose pamundëson DMA-në.
* Status: Procesori lexon këtë regjistër që të përcaktoj statusin e DMA-së. Bitat D0-D3 përdoren për të treguar nëse kanalet 0-3 kanë arritur numërimin terminal. Bitat D4-D7 përdoren nga procesori për të përcaktuar nëse ndonjë nga kanalet kë kërkesë nga DMA, të cilës nuk i është përgjigjur. 
* Mode: Procesori cakton këtë regjistër të percaktoj modin e operacionit të DMA-së. Bitat D0 dhe D1 përdoren për të zgjedhur një kanal. Bitat tjerë zgjedhin modin e operacionit për kanalin e zgjedhur. Bitat D2 dhe D3 përcaktojnë nëse transferi është nga një paisje hyrëse/dalëse në memorje (shkruarje), apo  nga memorja në paisje hyrëse/dalëse (lexim), apo operacion verifikues. Nëse D4 është caktuar, atëherë regjistri me adresë memoruese dhe regjistri numërues janë rimbushur me vlerat e tyre origjinale në fund të DMA transferit. Bitat D6 dhe D7 përcaktojnë mënyrën se si 8237 është perdorur. Në modin e veçuar, një bajt i të dhënave transferohet. Modi  i ujëvarës lejon që disa 8237 të ndahen për të zgjeruar numrin e kanaleve në më shumë se 4.
* Single Mask: Procesori cakton këta regjistra. Bitat D0 dhe D1 zgjedhin kanalin. Biti D2 pastron ose cakton bitin deaktivizues për këtë kanal. Përmes këtij regjistri, inputi DREQ i një kanali të specifikuar mund te deaktivizohet ose të mundësohet. 
* All Mask: Ky regjistër është i ngjashëm me single mask regjistrin, vetëm se këtu të katër kanalet mund të aktiviozohen, ose të deaktivizohen me një operacion shkrimi.
Përndryshe, 8237A ka tetë regjistra të të dhënave: një regjistër të adresave memoruese dhe një regjistër numërues për secilin kanal. Procesori cakton këta regjistra për të treguar lokacionin e madhësisë së memorjes kryesore  të afekuar nga transferet.

## Referimet 
* Computer Organization and Architecture, nga William Stallings
* mmap() and DMA, nga *Linux Device Drivers, 2nd Edition*, Alessandro Rubini & Jonathan Corbet
* Memory Mapping dheDMA, nga *Linux Device Drivers, 3rd Edition*, Jonathan Corbet, Alessandro Rubini, Greg Kroah-Hartman
* DMA and Interrupt Handling