[OSy] Re: OS2, otazky na DMA

Petr Tuma petr.tuma at mff.cuni.cz
Mon Feb 28 13:32:20 CET 2005


Dobry den,

> Mam otazku na DMA (Direct Memory Access). Ma dva prinosy (z
> prednasky).
> 
> 1. Nezatezuje procesor / rychlejsi prenos dat.
> 
> Priklad: Proces chce nacist data ze sitove karty do pameti. Zavola
> systemove volani a ceka na jeho dokonceni.
> 
> Bez pouziti DMA, se musi data nejdriv nakopirovat do registru
> procesoru. Pak z registru procesoru do pameti.
> 
> Vysledek je pomalost. Tytez data putuji po sbernici dvakrat. A dale
> pro preneseni napriklad 1024 byte s velikosti registru 4 byte, se
> musi vykonat priblizne konstanta krat 1024/4 instrukci procesoru. Ty
> by se dali s pouzitim DMA vyuzit pro beh jineho procesu.
> 
> S pouzitim DMA, se kontrola prenosu dat necha na radici DMA. Proces
> se uspi, dokud neni prenos dokoncen. Procesor se "venuje" jinym
> procesum.

Presne tak. Pro presne srovnani je potreba uvest take to, ze DMA radic 
je potreba naprogramovat pro pozadovany prenos, takze par I/O instrukci 
bude potreba vykonat tak i tak.

Mimochodem misto male rychlosti bych spise rikal mala efektivita. Dnesni 
procesory pracuji na gigahertzovych frekvencich, takze vykonani zhruba 
ctyr instrukci na prenos jednoho slova by stale jeste mohlo znamenat 
prenos o hypoteticke rychlosti v radu gigabajtu za vterinu ... to neni 
uplne mala rychlost :) ...

... realne samozrejme tuto rychlost nepujde dosahnout, protoze sbernice 
mezi procesorem a zarizenim nebude mit schopnost prenaset data tak 
rychle, jak rychle muze procesor vykonavat v cyklu ony zhruba ctyri 
instrukce. Stale ale zustane problem prenosu "nadvakrat" (ze zarizeni do 
procesoru, z procesoru do pameti), oproti prenosu "najednou" (ze 
zarizeni do pameti) tak, jak to dela DMA.

> Otazka 1: Pouziva radic DMA pro prenos dat cykly procesoru? Kdyz CPU
> nepotrebuje sbernici, tak ji vyuziva radic DMA (kdyz ma co delat)? 
> (radicem DMA myslim ten hardware, ktery ma prenosy na starosti)

V hrubych rysech ano.

Kdybychom chteli byt uplne presni, otazka kolize cyklu procesoru a cyklu 
DMA pomalu prestava davat smysl. Na starsich architekturach byl "panem 
sbernice" procesor a DMA se chapalo tak, ze si "pujcuje" sbernici od 
procesoru, ktery na ni pristupoval v kazdem instrukcnim cyklu. Sebrat 
procesoru moznost pouzit sbernici v takovych systemech znamenalo 
zastavit beh procesoru, proto se hledalo jak celou vec vyresit lepe - 
odtud pochazi "kradeni cyklu" a podobne triky - ale v konecnem dusledku 
casto nezbylo nic jineho nez procesor zastavit.

Dnesni sbernice uz procesoru "nepatri" v tom smyslu, ze by na ni 
neustale pristupoval. Napriklad PCI je zpravidla pripojena k procesoru 
pres dvojici north bridge & south bridge, takze pokud procesor 
pristupuje k pameti, na PCI sbernici to vubec neni videt. Kolize pri 
soucasnem pristupu do pameti ze strany procesoru a DMA pak resi prave 
north bridge & south bridge.

Usporadani sbernic je schematicky dobre videt treba na 
http://arstechnica.com/paedia/images/core-logic-southbridge.png.

> Otazka 2: Kam se hodi dopsat informaci o tom, ze prenos velkych
> souvislych bloku dat lze urychlit tim, ze se nastavuje jenom
> pocatecni adresa bloku, a nenastavuje se pro kazdy preneseny subblok?
> Podla mna to suvisi s DMA, ale aj s prenosom bez DMA.

Tohle konkretne je vlastnost sbernice PCI. Dobre pisete, ze s DMA tento 
mechanismus nemusi mit nic spolecneho, jedna se proste jen o lepsi 
(casove uspornejsi) navrh protokolu pro komunikaci po vodicich teto 
konkretni sbernice.

Cele to je samozrejme reseni na strane hardware, se kterym operacni 
system uz nic nenadela.

> 2. Je vhodny pro prenos dat, kdy jedno zarizeni je pomale.
> 
> Tohle sem moc dobre nepochopil. Chci se zeptat jak to je?

Jde mi o to, abyste neziskali v principu chybnou predstavu, ze DMA je 
pouze pro "rychle" prenosy. DMA (a bus mastering) sice muze prenaset 
data rychle, ale hodi se i pro prenosy, ktere jsou vyrazne pomalejsi nez 
maximalni prenosova kapacita sbernice.

Predstavte si situaci, kdy by operacni system mel prenest velky blok dat 
ze zarizeni, ktere je schopne dodavat je rychlosti napriklad 100 Mbit/s. 
Tohle uz dnes neni velka rychlost, procesor stihne mezi dvema 
prenesenymi bajty vykonat radove stovky instrukci. Moznosti obsluhy 
takoveho zarizeni jsou:

- primo bez pouziti preruseni ci primeho pristupu do pameti. To by ale 
vyzadovalo, aby vas program z kazde zhruba stovky instrukci vyhradil 
nekolik malo na obsluhu zarizeni, a takovy program se spatne pise. Bud 
by uz nedelal nic jineho, pak ale budete plytvat strojovym casem, nebo 
budete poctive za kazdych sto instrukci vkladat obsluhu zarizeni, coz 
neni prilis prakticke.

- s pouzitim preruseni. Prerusovat na kazdy preneseny bajt by ale 
znamenalo na kazdy preneseny bajt prepnout kontext beziciho procesu 
(schovani a obnoveni registru a dalsi veci), coz se v tech zhruba 
stovkach instrukci, ktere mate k dispozici, uz temer neda stihnout. 
Pokud by se prerusovalo jen na prenos bloku, dostavate se do stejne 
situace jako byla popsana nahore.

- s pouzitim primeho pristupu do pameti. Naprogramujete DMA radic a ten 
bude relativne pomalu prenaset data do pameti, procesor mezitim dela co 
chce. Ve srovnani s dalsimi dvema moznostmi idealni.

Proto upozornuji, ze DMA je vhodne take na relativne pomale prenosy. 
Takove DMA pak take prilis "nebrzdi" procesor, protoze neni nutne 
pozadavek na DMA ihned obslouzit - pokud si procesor zrovna plni cache, 
tech nekolik taktu muze DMA radic pockat nebo north bridge & south 
bridge drzet data v bufferu.

Snad to pomohlo :-) ...

Petr Tuma


-- 
Distributed Systems Research Group
Department of Software Engineering
Faculty of Mathematics and Physics
Charles University, Czech Republic
http://nenya.ms.mff.cuni.cz/~ceres



More information about the NSWI004 mailing list