[LUGOS-PROG] problem z branjem z diska

Blaz Antonic blaz.antonic at havn.com
Tue Oct 2 20:54:02 CEST 2001


> Imam funkcijo ki bere podatke iz diska. Branje poteka v PIO nacinu.
> Funkciji podam naslov prvega sektorja in stevilo sektorjev ki naj jih
> prebere iz diska.

Jaz bom rekel samo toliko .. enkrat sem delal en (bloaty, ocitno) driver
za eno stvar, ki naj bi delala tocno tako. Plonkal sem iz RB's intlist
in Linux kernela (kolikor sem sploh dojel, ker je - vsaj za moje pojme -
ide driver res zmedeno napisan) in prisel do necesa podobnega temu
tvojemu (samo da je tisto moje imelo se en kup dodatne krame za povezavo
s kernelom (ni bil samostojen program). Needless to say stvar ni nikoli
(v celoti) delala, v najboljsem primeru je prebrala par stvari (recimo
particijsko tabelo in root filesystem, boot je bil iz FD), v najslabsem
pa se je - po lastni diskreciji - enkrat vmes premislila in nehala
delat.
 
Moje znanje o tem ni danes (leta pozneje) nic boljse, kvecjem slabse
zato ze vnaprej en disclaimer, ce sem napisal kaksno bedarijo. Ze takrat
se mi je pa zdelo, da ne morem kar po svoje nekaj sarit gor in dol,
vsakic, ko se zgodi kaj (recimo timer interrupt), HDC pa veselo posilja
podatke in ga nic posebej ne briga a kdo to bere a ne, se mi zdi
logicno, da se procedura prekine oz. na koncu prebere nekaj neumnosti
(ali pa hoce brat, ko ni vec nic novega v data registru). Oz. HDC zmece
tiste podatke v prazno, ker medtem moj driver ne more brat iz data
registra (zato, da se pac dogajajo druge reci).

Edina smiselna resitev se mi je zdela predelat vse skupaj tako, da bo
interrupt-driven, torej da ne bodo podatki kar leteli v data register,
tam jih pa ne bo nihce pobral. Pa se zelo grd nacin je to, IO polling
:-)) In ja, medtem me je tudi minilo vse skupaj delat in sem to opustil
(itak sem delal za svoje veselje, za povrh je pa bila alternativna
resitev z BIOSom kar funkcionalna).

V tvoj program sem ti dopisal par komentarjev, nic takega, kar bi
vplivalo na delovanje.

>   pocakam da se pobrise BSY bit v IDE_STATUS_REG

To je (mislim da) 6. bit v statusnem registru (jaz to stvar poznam pod
"drive ready", a govoriva o isti stvari ?). Tako sem imel tudi jaz
narejeno .. ocitno ne dovolj dobro.

>   IDE_NSECTOR_REG = 1

Kaj je to ? Sector count v enem prehodu (torej branje enega sektorja na
ukaz) ??

>   IDE_STATUS_REG = 0x20 (komada za branje)

Ceprav je res, da sta statusni in komandni register na istem IO naslovu
ti tehnicno ne pises v statusni register (ker je pac read only :-))). Ce
bi se recimo v prihodnosti preselil eden od teh dveh registrov na drug
naslov bi bilo tvoj program precej zoprno popravljat - ce bi imel ze na
zacetku locene oznake pa popravis samo header.
 
>   ce je postavljen ERR bit v IDE_STATUS_REG ali ce DRQ bit ni postavljen

Kateri je pa DRQ ? ERR je (domnevam) bit 0 ?? In kaj ti sploh pomaga
DRQ, ce ne delas z DMA ? (tukaj sem mogoce bedarijo vprasal :-))
 
> torej se po nekaj branjih postavi ERR bit ali pa se DRQ ne postavi!
> A mogoce kdo ve, zakaj ta funkcija ne dela oz. cesa ne delam pravilno?

A pa sploh kdaj pogledas, kaj ti potem napise v error register (read
only, na istem naslovu kot write-precompensation, ki je write-only) ??
Sicer ni najbolj informativno, ampak vsaj nekaj vec podatkov bi moral
imet ...

Blaz Antonic




More information about the lugos-prog mailing list