[linux] Re: hdparm doet niet wat ik wil!

Paul Slootman paul+nospam op wurtel.net
Zo Mrt 25 21:40:19 CEST 2007


On Sat 24 Mar 2007, joop gerritse wrote:
> 
> ja, maar wacht even-- toen ik rond 1985 les gaf, was het al zo, dat je de CPU 
> uiteraard niet ging belasten met zoiets triviaals als "haal byte van adres 
> i++; schrijf byte naar adres j++". Processors kostten toen nog geld, en dit 
> simpele werk kon ook op de controller, met DMA.

De controller kon die DMA inderdaad wel doen, maar de CPU moest de
transfer klaarzetten nadat via een interrupt het signaal gegeven was dat
de data op de controller beschikbaar was. De controller kon dus niet
zomaar zelf een DMA transfer starten.

> > Toen kwam de Adaptec 1540 scsi controller, dat was een bus master die
> > dus zelf DMA kon initieren zonder tussenkomst van de CPU. Daarom heette
> > het zo lang dat SCSI veel beter was want dat gaf performance, dat
> > belastte de CPU zelf niet itt. "gewone" MFM/RLL (en later IDE) disken.
> > Dat is feitelijk wat in deze thread met DMA bedoeld wordt: een disk
> > subsystem die zelf DMA kan doen wanneer dat nodig is zonder dat de CPU
> > daarbij nodig is.  Pas bij latere IDE incarnaties is dat er gekomen.
> >
> 
> Dat kan waar zijn (ik had toen een VAX, en PC's waren voor amateurs ;-) ), 
> maar zo moeilijk is DMA toch niet? Zoals ik al zei: in de jaren '70 bestond 
> dat al. In mijn eerste PC (een XT) zat al DMA, en ik heb wat moeite om te 
> geloven dat IDE (dat kwam wat later) eerst geen DMA aankon. Ik kan me wel 

De MFM, RLL en eerste IDE controllers konden inderdaad niet
_zelfstandig_ een DMA transfer opzetten en initieren.
Pas bij een bus master DMA kaart (zoals de 1540) kon dat. Op die 1540
zat dan ook een processor om dat af te handelen... (ik meen zelfs een
Z80, maar wellicht ben ik daarbij in de war met een andere).

> > Eerst moest de CPU alles doen. De harddiskcontroller was toen meer
> > analoge elektronica dan digitaal :) Er was wel een soort DMA maar dat
> > werd vanuit de CPU geinitieerd (dus feitelijk PIO).
> 
> Volgens mij wordt DMA sowieso vanuit de CPU geïnitieerd, want vanuit het 
> programma, en zo hoort het ook; ik geloof niet dat dat veranderd is. De CPU 
> geeft aan: haal zoveel kilobytes op adres xxx en schrijf ze weg naar adres 
> yyyyyy. Dan zorgt DMA voor de rest.

Bij een busmaster DMA zegt de driver (dus de CPU) "ik wil die sectors
van de disk, en zet daar maar neer", en krijgt een interrupt wanneer de
data "daar" dus al staat, dus als de DMA al plaatsgevonden heeft.
Bij een niet-busmaster moet de driver (dus de CPU) zeggen "haal die
sectors van de disk", en krijgt een interrupt wanneer dat gedaan is.
Daarna moet de DMA nog opgezet worden voor de IO van kaart (of
controller, zo je wilt) naar hoofdgeheugen.

> O ja, en PIO is volgens mij gewoon een variant op while no change do nothing; 
> react on change ; done.

Niet echt... Daar moet elke byte (of word) een voor een via IO ports
gelezen worden. Een busy wait is het niet, wel een busy transfer :)


Paul Slootman



More information about the Linux mailing list