lab_ac12

9
Accesul direct la memorie 1. Introducere Accesul direct la memorie (DMA - Direct Memory Access) este folosit pentru transferurile rapide dintre dispozitivele de intrare/iesire si memorie fara interventia CPU. Accesul direct la memorie este folosit în driver-ele de floppy disk si de hard disk, dar poate fi folosit si la transferuri de la alte dispozitive de intrare sau iesire (Sound Blaster, CD-ROM, placi de retea, etc) si memorie. Transferuri DMA se pot face în ambele directii între memorie si porturile de intrare/iesire precum si între doua zone de memorie. 2. Controller-ul DMA I8237 Controller-ul de acces direct la memorie 8237 este un circuit de interfata cu periferia pentru sistemele cu microprocesoare. El este proiectat sa îmbunatateasca performanta sistemului permitând dispozitivelor externe sa transfere direct informatia catre sau de la memoria sistemului. Circuitul ofera si posibilitatea de transfer memorie-memorie Circuitul 8237 ofera o varietate larga de caracteristici programabile pentru a îmbunatati viteza transferurilor, optimizarea sistemului si a permite reconfigurarea dinamica prin program. 8237 este proiectat sa fie folosit împreuna cu un registru extern de adrese pe 8 biti (8282). Controller-ul 8237 contine patru canale independente si poate fi extins la orice numar de canale prin conectarea în cascada a mai multor astfel de circuite (modul de conectare în cascada va fi prezentat mai târziu). Diagrama de timp pentru initierea unui transfer DMA si acceptarea lui de catre procesor este prezentata în figura 1. Dintre registrele interne al lui 8237, cele folosite în programare sunt urmatoarele: Registrul de mascare (Controller 1 - port 00Ah; Controller 2 - port 0D4h):

Upload: constantin-alexandru

Post on 17-Jan-2016

221 views

Category:

Documents


0 download

DESCRIPTION

Automatica si Calculatoare

TRANSCRIPT

Page 1: LAB_AC12

Accesul direct la memorie 1. Introducere Accesul direct la memorie (DMA - Direct Memory Access) este folosit pentru transferurile rapide dintre dispozitivele de intrare/iesire si memorie fara interventia CPU.

Accesul direct la memorie este folosit în driver-ele de floppy disk si de hard disk, dar poate fi folosit si la transferuri de la alte dispozitive de intrare sau iesire (Sound Blaster, CD-ROM, placi de retea, etc) si memorie. Transferuri DMA se pot face în ambele directii între memorie si porturile de intrare/iesire precum si între doua zone de memorie. 2. Controller-ul DMA I8237 Controller-ul de acces direct la memorie 8237 este un circuit de interfata cu periferia pentru sistemele cu microprocesoare. El este proiectat sa îmbunatateasca performanta sistemului permitând dispozitivelor externe sa transfere direct informatia catre sau de la memoria sistemului. Circuitul ofera si posibilitatea de transfer memorie-memorie

Circuitul 8237 ofera o varietate larga de caracteristici programabile pentru a îmbunatati viteza transferurilor, optimizarea sistemului si a permite reconfigurarea dinamica prin program. 8237 este proiectat sa fie folosit împreuna cu un registru extern de adrese pe 8 biti (8282).

Controller-ul 8237 contine patru canale independente si poate fi extins la orice numar de canale prin conectarea în cascada a mai multor astfel de circuite (modul de conectare în cascada va fi prezentat mai târziu). Diagrama de timp pentru initierea unui transfer DMA si acceptarea lui de catre procesor este prezentata în figura 1.

Dintre registrele interne al lui 8237, cele folosite în programare sunt urmatoarele:

Registrul de mascare (Controller 1 - port 00Ah; Controller 2 - port 0D4h):

Page 2: LAB_AC12

Bitii pe zero sunt nefolositi. Fiecare canal are asociat un bit de mascare prin care

dezactiveaza cererile DMA (DREQ). Fiecare bit de mascare este automat pus pe 1 atunci când canalul respectiv termina un transfer, daca canalul nu este programat pentru autoinitializare. La RESET toti bitii de mascare sunt pusi pe 1 logic. § Registrul de mod (Controller 1 - port 00Bh; Controller 2 - port 0D6h):

Modul de transfer DMA poate fi: § transfer la cerere - în acest mod dispozitivul este programat sa faca transferuri

pâna când: contorul ajunge la 0 (TC - terminate count), sau apare o cerere externa de oprire a transferului (EOP - End of Process), sau se dezactiveaza DREQ. Astfel transferul poate continua pâna când dispozitivul de intrare/iesire deservit de controller-ul DMA, si-a epuizat datele;

Page 3: LAB_AC12

§ transfer pe cuvânt (singular) - dispozitivul este programat a transfera doar un octet (sau cuvânt), dupa care ceda controlul procesorului; pentru un nou transfer trebuie sa recâstige magistrala. Acest mod este folosit pentru dispozitivele care, datorita vitezei, nu pot transfera întregul bloc de date. Dispozitivul periferic va activa DREQ pentru fiecare cuvânt transferat. (Controller-ul de floppy disk foloseste acest mod de transfer)

§ transfer pe bloc - controller-ul este activat de DREQ si efectueaza transferuri pâna când contorul ajunge la zero (TC) sau apare o cerere externa de oprire a transferului (EOP). DREQ trebuie sa ramâna activ doar pâna controller-ul activeaza DACK;

§ modul în cascada - Este folosit pentru a cupla în cascada mai multe circuite 8237 pentru o expandare simpla a sistemului. În cazul transferurilor pe bloc sau la cerere, odata ce controller-ul DMA a câstigat

magistrala sistem, se transfera un bloc de date de pâna la 64Ko. Controller-ele de hard disk mai vechi, foloseau modul de transfer la cerere, dar, crescând viteza CPU-urilor, este mai eficient a fi folosit acesta în realizarea transferurilor cu hard disk-ul.

Registrul indicator la nivel de octet (Controller 1 - port 00Ch; Controller 2 - port 0D8h): Dupa o scriere în acest registru, prima scriere într-un registru pe 16 biti se va face în octetul mai putin semnificativ, iar urmatoarea scriere se va face în octetul mai semnificativ samd. § Registrul de comanda (Controller 1 - port 008h; Controller 2 - port 0D0h -

scriere):

Pentru a muta un bloc de date dintr-o zona de memorie în alta, cu un minim efort

din partea procesorului, controller-ul 8237 include posibilitatea realizarii transferurilor memorie-memorie. Prin setarea bitului 0 din registrul de comanda, canalele 0 si 1 sunt folosite în transferul memorie-memorie, transfer initiat prin activarea soft a lui DREQ (prin registrul de initiere transfer) pentru canalul 0. Diagrama de timp pentru un transfer DMA este prezentata în figura de mai jos (figura 5):

Page 4: LAB_AC12

Timing comprimat - pentru a obtine o latime de banda mai mare, acolo unde

caracteristicile sistemului o permit, 8237 poate comprima timpul de transfer cu doua impulsuri de tact. 8237 ofera doua tipuri de codificare a prioritatilor, selectabile prin program. Primul tip este cel cu prioritate fixa în care ordinea de tratare a cererilor DMA este în ordinea crescatoare a numarului canalului: canalul 0 are prioritatea cea mai mare, iar canalul 3 care are prioritatea cea mai mica. Un al douilea tip de codificare a prioritatilor este prioritatea rotativa în care ultimul canal care a fost deservit devine cel mai putin prioritar la o urmatoare cerere DMA.

Generarea adreselor - pentru a reduce numarul de pini ai circuitului 8237, liniile A8-15 din magistrala de adrese sunt multiplexate cu liniile de date. Pentru a face distinctia între adrese si date este folosit semnalul ADSTB generat de catre controller. § Registrul de stare (Controller 1 - port 008h; Controller 2 - port 0D0h - citire):

§ Registrul de initiere transfer (Controller 1 - port 009h; Controller 2 - port 0D2h):

3. Accesul direct la memorie la calculatoarele PC/AT

Page 5: LAB_AC12

Calculatoarele compatibile IBM PC/AT folosesc pentru accesul direct la memorie doua circuite 8237A conectate în cascada (circuitul 8237A este identic cu 8237, doar ca poate realiza transferuri DMA pe 16 biti).

Astfel PC-ul dispune de 8 canale DMA programabile, din care unul este folosit pentru conectarea celui de-al doilea controller în cascada. În figura de mai jos (figura 8), este prezentata, la nivel de bloc, schema de conectare a celor doua controller-e la microprocesor.

În tabelul urmator sunt specifica utilizarea canalelor DMA.

Canalul Folosit la AT Controller

0 liber 1 (8 biti)

1 SDLC (Synchronous Data Link Control) 1 (8 biti)

2 diskette adapter 1 (8 biti)

3 hard disk adapter 1 (8 biti)

4 conectarea în cascada pentru controller-ul 1 2 (16 biti)

5 liber 2 (16 biti)

6 liber 2 (16 biti)

7 liber 2 (16 biti)

În continuare vom prezenta modul de programare a unui chip DMA. Când programatorul doreste pornirea unui transfer DMA, trebuie sa cunoasca urmatoarele trei tipuri de informatii: § În ce pagina de memorie se doreste a se face transferul;

Page 6: LAB_AC12

§ Offset-ul în cadrul respectivei pagini de memorie; § Care este numarul de cuvinte ce se doreste transferat.

Transferul DMA are doua restrictii de care, din nou, trebuie sa tinem seama: § Nu se pot transfera mai mult de 64K de date într-un singur transfer; § Nu se poate depasi într-un transfer limita de pagina.

Prima restrictie este relativ usor de depasit: se transfera primul bloc de date, dupa ce acesta s-a terminat se trece la urmatorul bloc de date.

În continuare vom explica ce reprezinta aceste pagini de memorie. Imaginea primilor 1MB de memorie din sistem (PC/AT) este împartita în 16 pagini a câte 64K fiecare:

Pagina Spatiul de adrese

0 0000:0000 - 0000:FFFF

1 1000:0000 - 1000:FFFF

2 2000:0000 - 2000:FFFF

3 3000:0000 - 3000:FFFF

4 4000:0000 - 4000:FFFF

5 5000:0000 - 5000:FFFF

6 6000:0000 - 6000:FFFF

7 7000:0000 - 7000:FFFF

8 8000:0000 - 8000:FFFF

9 9000:0000 - 9000:FFFF

A A000:0000 - A000:FFFF

B B000:0000 - B000:FFFF

C C000:0000 - C000:FFFF

D D000:0000 - D000:FFFF

E E000:0000 - E000:FFFF

F F000:0000 - F000:FFFF

Tabelul 2

Page 7: LAB_AC12

În tabelul 2 au fost trecute adresele logice ale paginilor. O adresa logica este formata din un segment si un offset (deplasament). Atât segmentul cât si deplasamentul în cadrul segmentului sunt pe 16 biti. Adresa fizica la 8086 si în modul real la 80x86 este pe 20 biti si se obtine din adresa logica prin urmatoarea formula:

adresa fizica (20 biti) = segment (16 biti)*16 + offset (16 biti) sau

adresa fizica (20 biti) = segment (16 biti)<<4 + offset (16 biti) Pentru calculul paginii si a deplasamentului în cadrul paginii (primii 4 biti din adresa fizica reprezinta pagina iar urmatorii 16 biti reprezinta deplasamentul), avem nevoie de o rutina care primeste la intrare o adresa logica si returneaza adresa fizica calculata din cea logica.

Lungimea length a blocului de transferat prin DMA se specifica controller-ului DMA prin valoarea length - 1. Deci daca trimitem controller-ului o lungime 0 el va face un transfer pe un octet, iar daca-i trimitem valoarea 0FFFFH, transferul va fi de 64K. Exisa trei porturi folosite pentru a programa un canal DMA: § Registrul de pagina; § Registrul de adresa (offset); § Registrul continând lungimea transferului.

Tabelul urmator contine adresele acestor porturi pentru registrele fiecarui canal:

Canalul DMA Pagina Adresa Lungime

0 087h 000h 001h

1 083h 002h 003h

2 081h 004h 005h

3 082h 006h 007h

4 08Fh 0C0h 0C2h

5 08Bh 0C4h 0C6h

6 089h 0C8h 0CAh

7 08Ah 0CCh 0CEh

Tabelul 3

Deoarece controller-ului DMA i se pot trimite doar cuvinte pe 8 biti, cuvintele pe 16 biti se trimit prin doua scrieri succesive la acelasi port, prima data se scrie octetul mai putin semnificativ iar apoi octetul mai semnificativ.

Pasii urmati pentru programarea unui transfer DMA

Page 8: LAB_AC12

Zona de date a programului va contine: § Definirea unui tip de date structura ce contine informatiile necesare unui transfer

DMA § Declararea a 8 variabile pentru cele 8 canale DMA § Adresele de port ale registrelor de pagina pentru fiecare canal

087h, 083h, 081h, 082h, 08Fh, 08Bh, 089h, 08Ah § Adresele de port ale registrelor de adresa pentru fiecare canal

000h, 002h, 004h, 006h, 0C0h, 0C4h, 0C8h, 0CCh § Adresele de port ale registrelor de lungime pentru fiecare canal

001h, 003h, 005h, 007h, 0C2h, 0C6h, 0CAh, 0CEh § Adresele de port ale registrelor de mascare pentru fiecare controler

00Ah, 0D4h § Adresele de port ale registrelor de mod pentru fiecare controler

0Bh, 0D6h § Adresele de port ale registrelor de flip-flop pentru fiecare controler

00Ch, 0D8h § Adresele de port ale registrelor de comanda pentru fiecare controler

008h, 0D0h § Adresele de port ale registrelor de stare pentru fiecare controler

008h, 0D0h § Adresele de port ale registrelor de initiere transfer pentru fiecare controler

009h, 0D2h

Pasii necesari pentru programarea unui transfer DMA memorie-port sau port-memorie. • rezerva spatiu in memorie pentru transfer; • foloseste canalul DMA corespunzator dispozitivului extern cu care se lucreaza; • dezactiveaza intreruperile; • mascheaza canalul; • initializeaza registrul flipflop; • seteaza registrul de mod corespunzator transferului dorit

- scriere in memorie: 45h - citire din memorie: 49h

• calculeaza adresa fizica pentru zona de memorie implicata in transfer; • incarca registrul de pagina cu valoarea obtinuta pentru pagina; • incarca registrul de adrese cu valoarea offset-ului; • incarca registrul contor cu lungimea sirului de caractere; • demascheaza canalul; • valideaza intreruperile. • Pasii necesari pentru programarea unui transfer DMA memorie-memorie. • rezerva spatiu in memorie pentru transfer; • foloseste canalele DMA 0 si 1 pentru transferul memorie-memorie, canalul 0 folosit

pentru citire din memorie(din zona sursa) iar canalul 1 pentru scriere in memorie (in zona destinatie);

Page 9: LAB_AC12

• dezactiveaza intreruperile; • mascheaza canalele 0 si 1; • initializeaza registrul flipflop; • seteaza registrul de mod pentru canalul 0; • seteaza registrul de mod pentru canalul 1; • calculeaza adresa fizica pentru zona de memorie sursa; • incarca registrul de pagina al canalului 0 cu valoarea obtinuta pentru pagina; • incarca registrul de adrese al canalului 0 cu valoarea offset-ului; • incarca registrul contor al canalului 0 cu lungimea sirului de caractere; • calculeaza adresa fizica pentru memoria video; • incarca registrul de pagina al canalului 1 cu valoarea obtinuta pentru pagina; • incarca registrul de adrese al canalului 1 cu valoarea offset-ului; • incarca registrul contor al canalului 1 cu lungimea sirului de caractere; • seteaza registrul de comanda pentru transferul memorie-memorie; • demascheaza canalul; • valideaza intreruperil; • initiaza transferul prin setarea unui bit in registrul de initiere, corespunzator canalului

0. Tema de laborator 1. Sa se realizeze un program C care realizeaza un transfer DMA memorie-memorie. Se transfera un sir de caractere din segmentul de date al utilizatorului în memoria video.