Comunicarea cu controlerul dma - sisteme de acces direct la memorie

După înregistrare, partea principală a activității conducătorului auto este de a configura controlerul DMA să funcționeze corect. Această sarcină nu este banală, dar, din fericire, kernelul exportă toate funcțiile necesare pentru un driver tipic.







Driverul trebuie să configureze controlerul DMA fie atunci când este apelat citirea sau scrierea. sau când vă pregătiți pentru transferuri asincrone. Această ultimă sarcină se efectuează fie în momentul deschiderii. sau ca răspuns la comanda ioctl. în funcție de șofer și de politica pe care o implementează. Codul dat aici este un cod care este numit de obicei prin metode de citire sau scriere a dispozitivelor.

Această secțiune oferă o scurtă trecere în revistă a internelor controlerului DMA, astfel încât să înțelegeți codul dat aici. Dacă doriți să aflați mai multe, vă recomandăm cu tărie să citiți și câteva manuale pentru echipamente care descriu arhitectura PC-ului. În special, nu avem de-a face cu problema transferurilor de date pe 8 biți în locul datelor pe 16 biți. Dacă scrieți drivere de dispozitiv pentru dispozitive de carduri ISA, pentru astfel de dispozitive, ar trebui să găsiți informațiile corespunzătoare în manualul hardware.

Controlerul DMA este o resursă partajată și ar putea fi confuzie dacă mai multe procesoare au încercat să o programeze simultan. Din acest motiv, controlerul este protejat de un spinlock, numit dma_spin_lock. Conducătorii auto nu ar trebui să manipuleze direct această blocare, totuși, aveți două funcții:

nesemnate long claim_dma_lock ();

Obține DMA de blocare a spinării. Această funcție blochează, de asemenea, întreruperile procesorului local; astfel încât valoarea returnată este un set de steaguri care descriu starea anterioară de întrerupere; trebuie să treceți la următoarea funcție pentru a restabili starea de întrerupere atunci când ați terminat lucrul cu blocarea.

void release_dma_lock (steaguri nesemnate lungi);

Returnează DMA cu centrifugare și restabilește starea anterioară de întrerupere.

Când utilizați funcțiile descrise mai jos, trebuie ținut un dispozitiv de blocare. Cu toate acestea, nu-l țineți în timpul I / O real. Când țineți spinelul, șoferul nu trebuie să adoarmă niciodată.

void set_dma_mode (canal int nesemnat, mod char);

void set_dma_addr (canal int nesemnat, nesigned int addr);

void set_dma_count (canal int nesemnat, număr nesemnat int);

Specifică numărul de octeți de trimis. Argumentul de numărare reprezintă numărul de octeți și pentru canalele pe 16 biți; în acest caz, numărul trebuie să fie egal.

În plus față de aceste funcții, există și o serie de opțiuni de menaj care ar trebui să fie utilizate atunci când lucrați cu dispozitive DMA:

void disable_dma (canal int nesemnat);

Canalul DMA poate fi dezactivat în controler. Pentru a preveni defecțiunile, înainte de configurarea controlerului, canalul trebuie deconectat. (În caz contrar, pot apărea deteriorări deoarece controlerul este programat utilizând transferuri de date pe 8 biți și, prin urmare, niciuna dintre funcțiile anterioare nu este efectuată în mod atomic).

void enable_dma (canal int nesemnat);







Această funcție spune administratorului că canalul DMA conține date valide.

int get_dma_residue (canal int nesemnificat);

Uneori șoferul trebuie să știe când transferul DMA este complet. Această funcție returnează numărul de octeți care nu au fost încă transmiși. Valoarea returnată este 0 după o transmisie reușită și este imprevizibilă (dar nu 0) în timp ce controlerul rulează. Imprevizibilitatea vine de la necesitatea obținerii unui reziduu de 16 biți prin două operații de intrare pe 8 biți.

void clear_dma_ff (canal int nesemnat);

Această funcție șterge flip-flop-ul (registrul de date) al DMA. Triggerul este utilizat pentru a controla accesul la registrele pe 16 biți. Regiștrii sunt disponibili prin două operații consecutive pe 8 biți, iar un declanșator este utilizat pentru a selecta octetul scăzut (când acesta este șters) sau octetul de ordin înalt (dacă este setat). După transmiterea a opt biți, declanșatorul schimbă automat starea; Înainte de a accesa registrele DMA, programatorul trebuie să elibereze declanșatorul (pentru a-l seta la o stare cunoscută).

Folosind aceste funcții, șoferul poate implementa următoarea funcție pentru pregătirea pentru transferul DMA:

int dad_dma_prepare (canal int, modul int, nesubetat int buf, nesemnate int count)

nesemnate steaguri lungi;

Apoi, pentru a verifica dacă DMA este finalizată cu succes, se folosește următoarea funcție:

int dad_dma_isdone (canal int)

semne lungi nesemnate = claim_dma_lock ();

retur (reziduu == 0);

Singurul lucru pe care trebuie să îl faceți este să configurați placa dispozitivului. Această sarcină depinde de dispozitiv și de obicei constă în citirea sau scrierea mai multor porturi I / O. Dispozitivele sunt foarte diferite. De exemplu, unele dispozitive se așteaptă ca programatorul să spună echipamentului cât de mare este tamponul DMA și uneori șoferul trebuie să citească valorile din dispozitiv. Pentru a configura placa, singurul dvs. prieten va fi un manual hardware.

Legea automatului Mili este dată de ecuațiile:

Legea funcționării automatului Moore este dată de ecuațiile:

Stivă (stiva născut - stiva ;. Read stiva) - un tip abstract de date care reprezintă o listă de articole, organizate pe baza LIFO (lastin engleză - firstout «ultimul venit - primul ieșit“ ..).

Cache-ul este un tampon intermediar cu acces rapid, care conține informații care pot fi interogate cel mai probabil. Accesul la datele din memoria cache este mai rapid decât selectarea datelor sursă dintr-o memorie mai lentă sau o sursă de la distanță, dar volumul acesteia este semnificativ limitat comparativ cu stocarea datelor sursă.

Memoria cache, care de obicei este absentă în cele mai simple dispozitive de procesare. În computerele mai complexe, cache-ul are mai multe nivele, cu cache-ul de nivel superior întotdeauna în chip-ul procesorului

Întrerupeți (întrerupe limba engleză) - un semnal care îi spune procesorului despre apariția unui eveniment. În acest caz, execuția secvenței de comenzi curente este suspendată și controlul este transferat către dispozitivul de tratare a întreruperii, care răspunde la eveniment și îl servește și apoi readuce controlul la codul întrerupt

În funcție de sursa semnalului, întreruperile sunt împărțite în:

· AC sau extern (hardware) - evenimentele care provin din surse externe (de exemplu, dispozitive periferice), și pot apărea în orice moment arbitrar: semnalul de la timer-ul, placa de rețea, sau o unitate de disc, interfața tastatură, mișcarea mouse-ului. Apariția unei astfel de întreruperi în sistem este tratată ca o cerere de întrerupere (IRQ);

· Program (caz special de întrerupere internă) - sunt inițiate prin executarea unei instrucțiuni speciale în codul programului. Întreruperile software sunt de obicei folosite pentru a accesa funcțiile firmware-ului, driverelor și sistemului de operare.

Acces direct la memorie. Procesorul nu participă la transferul de date. Este deconectat de la coloana vertebrală a sistemului, iar toate operațiunile de schimb de date sunt sub controlul unui dispozitiv de control special - controlerul PDP. Acest mod este utilizat pentru PU-uri de mare viteză, când lățimea de bandă a procesorului este insuficientă.

Busul de memorie este proiectat pentru a transfera informații între OP și MP, precum și OP și UE în modul UAP. Informațiile de pe magistrala de memorie sunt transmise la o viteză semnificativ mai mică decât pe magistrala procesorului. Acest lucru se datorează faptului că magistrala de memorie conține mai puține linii de date. Numărul lor este determinat de lățimea eșantionului. În plus, după cum sa menționat deja, performanța cipurilor de memorie intră întotdeauna în spatele vitezei procesorului, deci procesul de transfer de informații între memoria și procesoarele.

Dacă observați o eroare în text, selectați cuvântul și apăsați Shift + Enter







Trimiteți-le prietenilor: