Acces direct la memorie ( de exemplu, acces direct la memorie , DMA ) - un mod de schimb de date între dispozitivele computerului sau între un dispozitiv și memoria principală , la care nu participă unitatea centrală de procesare (CPU). Deoarece datele nu sunt trimise către și de la CPU, viteza de transfer este crescută.
Dacă trebuie să umpleți celulele de memorie amplasate la adrese consecutive, utilizați modul de funcționare al magistralei „burst” ( eng. burst ):
O optimizare similară a procesorului cu memorie este extrem de dificilă.
În arhitectura originală a PC-ului IBM ( autobuz ISA ), DMA era posibilă numai cu un controler hardware DMA ( cip Intel 8237 ).
Controlerul DMA poate accesa magistrala de sistem independent de CPU și are mai multe registre . Registrele controlerului DMA sunt disponibile CPU pentru citire și scriere și sunt folosite pentru a seta:
Luați în considerare procesul de citire a datelor de pe un dispozitiv. CPU scrie valori în registrele controlerului DMA, trimite o comandă dispozitivului (de exemplu, un disc) pentru a citi datele. Dispozitivul citește date (de exemplu, de pe disc) și scrie în memoria sa internă (buffer). Controlerul DMA setează adresa memoriei PC-ului pe magistrala de adrese , trimite o solicitare către dispozitiv pentru a citi date din memoria internă (buffer) a dispozitivului. Dispozitivul primește o solicitare și nici măcar nu știe dacă cererea a venit de la CPU sau de la controlerul DMA. Dispozitivul trimite următorul cuvânt din memoria sa internă (buffer) către RAM-ul PC-ului la adresa situată pe magistrala de adrese . Dispozitivul trimite apoi un semnal către controlerul DMA care indică sfârșitul înregistrării. Controlerul DMA mărește adresa memoriei computerului și o pune pe magistrala de adrese , reduce valoarea contorului său de octeți și trimite din nou o solicitare de citire a datelor din memoria internă (buffer) a dispozitivului. Bucla se repetă până când valoarea contorului devine zero. După încheierea ciclului, dispozitivul inițiază o întrerupere a procesorului , indicând finalizarea transferului de date.
Un controler DMA capabil să efectueze mai multe operații în paralel se numește multi-canal.
Autobuzul MicroChannel , SBus , puternic influențat de PCI și derivatele sale conceptuale AGP și PCI-X , utilizează o implementare diferită a DMA. Aceste autobuze permit oricărui dispozitiv să anunțe nevoia de a sechestra autobuzul, o astfel de nevoie fiind satisfăcută de așa-numitul arbitru cu prima ocazie. Un dispozitiv care captează cu succes magistrala setează în mod independent adresa și semnalele de control pe magistrală și îndeplinește de ceva timp același rol principal pe magistrală ca și CPU. Accesul CPU la magistrală este apoi dezactivat momentan.
Într-o astfel de implementare DMA, nu există un controler DMA și nici un număr de intrare al controlerului DMA.
Unele dispozitive PCI mai vechi , și anume implementările plăcilor de sunet ale familiei Sound Blaster , foloseau controlerul 8237 DMA din arhitectura originală IBM PC . Această utilizare este cu siguranță învechită pentru PCI , dar a fost menținută pentru a asigura compatibilitatea completă a software -ului și a driverelor cu plăcile de sunet Sound Blaster pentru magistrala ISA .
Acest suport se numește „Distributed DMA” (D-DMA) și este implementat în hardware atât în dispozitiv, cât și în logica podului PCI - ISA , în care logica controlerului 8237 DMA (original pentru PC-ul IBM ) este localizat de asemenea pe sisteme PCI . Implementarea folosește două solicitări: prima solicitare este de la dispozitiv la puntea PCI-ISA, a doua este de la punte la RAM PC .
În afară de implementările Sound Blaster menționate , practic niciun dispozitiv PCI nu utilizează conceptul de „număr de intrare al controlerului DMA”, și nici 8237 nu folosește deloc.
Pe sistemele de operare cu memorie virtuală paginată , cum ar fi Windows și familia UNIX , o regiune adiacentă de adrese virtuale poate fi implementată prin pagini fizice discontinue.
Executarea DMA pentru o astfel de regiune este destul de o provocare. De asemenea, o sarcină dificilă este execuția DMA pe memoria livrată.
Rezolvarea acestei probleme necesită identificarea paginilor fizice care implementează regiunea și blocarea acestora de la expediere prin accesarea subsistemului de memorie virtuală. Mai departe, devine posibil să se găsească adresele fizice ale paginilor regiunii, care, în general, nu sunt continue și formează așa-numita „lista de dispersare” ( în engleză scatter-gather list , SGL ).
Sarcina de a executa DMA pe o astfel de listă poate fi rezolvată în unul dintre următoarele moduri.
Sprijinit de toate sistemele de operare de top . Activarea suportului pe Windows necesită un apel cu parametrul setat la . IoGetDmaAdapterDEVICE_DESCRIPTION::ScatterGatherFALSE
Defecte:Utilizat în controlerele SCSI mai vechi de 8 biți livrate cu scanere de tip HP ScanJet .
Defecte:Dispozitivul citește SGL cu același mecanism DMA de blocare a busului ca și datele reale, implementând astfel funcționalitatea unui procesor care citește și execută propriul „program” implementat ca o listă de descriptori SGL . Această arhitectură se numește „chain DMA” ( eng. chain DMA ), implementată în aproape toate echipamentele standard ale unui computer modern - Intel IDE ( eng. integrated drive electronics ) (într-o formă primitivă), USB UHCI , USB OHCI , 1394 OHCI , precum și în majoritatea adaptoarelor PCI , Ethernet și SCSI (chiar și vechiul AIC78xx ). Un bun exemplu de implementare a acestei arhitecturi într-o formă foarte complexă și avansată este dat în specificația hardware 1394 OHCI . Potrivit unor rapoarte, această arhitectură, numită „programe de canal”, a fost folosită încă de la IBM 360 , cunoscută în URSS ca computere ES .
Defecte:Un astfel de echipament se numește IOMMU ( unitate de gestionare a memoriei de intrare/ieșire ) . A fost implementat atât pe computerele de la Sun Microsystems pentru magistrala SBus , cât și pe computerele de la DEC Alpha pentru magistrala PCI . Până de curând, aproape niciodată nu a fost implementat în sistemele convenționale x86 / PCI , deși în prezent există o tendință de a schimba această situație, în principal cu scopul de a îmbunătăți performanța hipervizoarelor de mașini virtuale . Întotdeauna implementat pentru magistrala AGP numită AGP GART pentru a facilita accesul aleator GPU la texturile care se află în memoria principală. Din partea dispozitivului, acest hardware a fost standardizat prin specificația AGP , din partea software , nu a existat nicio standardizare, iar implementarea a depins de producătorul cipului Northbridge între AGP și memorie (de unde și necesitatea unui „ driver AGP ”, cum ar fi pentru cipurile Intel ). Setul de apeluri de nuclee ale sistemelor de operare dezvoltate , cum ar fi Windows , a conținut întotdeauna o abstractizare arhitecturală a IOMMU ( și buffer-ul de respingere , înțeles ca un fel de IOMMU , acceptă, de asemenea, aceste apeluri ), permițând aceluiași driver de dispozitiv să îl suporte atunci când este atașat. prin diferite IOMMU -uri . agp440.sys MapTransferGetScatterGatherList
Defecte:Controlerul de hard disk IBM PC /AT original nu a suportat DMA și a necesitat instrucțiuni REP INSW/REP OUTSW pentru a trimite toate datele I/O pe disc prin portul 0x1f0.
La începutul anilor 1990, unitățile MFM / RLL au căzut în nefolosire („s-au stins”), înlocuite cu unități IDE , dar interfața de înregistrare a software -ului la controler nu s-a schimbat.
Performanța scăzută a unui astfel de controler a devenit o problemă serioasă, în special pe sistemele PCI . În plus față de necesitatea mai multor cicluri PCI pentru a transfera la fiecare doi octeți de date, acest lucru a dus la încărcarea I/O pe disc a procesorului .
Pentru a rezolva problema, o serie de companii, inclusiv Intel , au dezvoltat controlere IDE cu suport DMA. Controlerele au fost și sunt încă software incompatibile între diferiți producători, deși compatibilitatea tuturor Intel IDE/ATA/SATA de jos în sus este mai mult sau mai puțin acceptată.
De asemenea, o caracteristică a acestui suport este utilizarea de noi comenzi de protocol IDE / ATA, ceea ce înseamnă cerința de a suporta DMA nu numai de către controler, ci și de hard disk-ul în sine .
În jurul anului 2000, suportul DMA pe magistrala IDE/ATA a evoluat pentru a crește viteza de ceas al magistralei, ceea ce a necesitat un nou tip de cablu de la controler la unitate cu dublul numărului de conductori mai mici. Această tehnologie a fost numită „Ultra DMA” ( UDMA ).
Multe sisteme de operare au necesitat acțiunea administratorului pentru a utiliza IDE DMA. Deci, de exemplu, nucleele Linux standard până în 2004 nu au avut un astfel de suport, era necesar să se reconstruiască nucleul cu un fișier de configurare editat.
În familia de sisteme de operare Windows , suportul pentru IDE DMA a apărut pentru prima dată numai pentru Intel în pachetele de service pentru Windows NT 4 și a necesitat editarea manuală a registrului pe majoritatea sistemelor pentru a-l activa.
În Windows 2000 , această cerință a dispărut, dar a existat o cerință ca și discurile care nu pot fi pornite să fie listate și setate la DMA în BIOS . Aceste setări au devenit vizibile pentru nucleul sistemului de operare prin tehnologia ACPI , iar sistemul de operare nu a permis activarea DMA pentru un disc care nu este listat în lista de discuri BIOS . Prin comparație, Windows NT 4 a acceptat atât dimensiunea personalizată a discului, cât și DMA, fără a lista discul în BIOS .
Pe Linux ,hdparm o comandă (vezi mai jos ) poate fi utilizată pentru a activa sau dezactiva manual IDE DMA . Versiunile moderne de kernel activează automat modul DMA, care poate fi văzut în mesajele de depanare (linii precum „ata1.00: configurat pentru UDMA/133” sau „hda: modul UDMA/33 selectat”).
hdparm -i /dev/sda
… | M byte / s | … |
---|---|---|
Modul 0 | 16.7 | UDMA16 |
Modul 1 | 25,0 | UDMA25 |
Modul 2 | 33.3 | UDMA33 |
Modul 3 | 44.4 | UDMA44 |
Modul 4 | 66,7 | UDMA66 |
Modul 5 | 100,0 | UDMA100 |
Modul 6 | 133.3 | UDMA133 |