[pso] [Tema5][Linux]Neclaritati bio + flush
Razvan Deaconescu
razvand at cs.pub.ro
Fri Jun 22 12:12:07 EEST 2007
sorin gsmcreation wrote:
> Salut,
>
> Am citit ceva documentatie, insa am destule chestii
> neclare legate de tema 5.
>
> Pentru o citire, de exemplu, din userspace, ssr
> primeste cerere de citire a unui sector logic, sa
> zicem sectorul 1.
>
> Citirea acestui sector logic necesita citirea a doua
> parti (in total: 512+4 bytes) care se afla in doua
> sectoare fizice (in sectoarele 1 si 2 fizice in acest
> caz). Aceste sectoare fizice trebuie citite de pe
> /dev/sdb1 (si similar pt /dev/sdb2). Trebuie
> construita
> deci o structura bio care trebuie trimisa catre
> driverul
> scsi, prin care sa-i precizam ca avem nevoie de
> 512 bytes din sectorul 1 si 4 bytes din sectorul 2 de
> pe /dev/sdb1.
De fapt trebuie sa construiesti doua structuri bio: una va fi transmisa
driver-ului SCSI catre /dev/sdb1 si alta catre /dev/sdb2.
> Dupa ce am studiat ceva documentatie, tot nu-mi dau
> seama care campuri din bio trebuie completate astfel
> incat sa construiesc un bio catre scsi in care sa cer:
> - X bytes din sectorul i incepand de la un offset
> - Y bytes din sectorul i+1 incepand de la offset 0
> (unde X+Y = 516 bytes)
> - cei X+Y bytes sa fie copiati intr-un buffer pe care
> sa-l precizez eu, iar cu ajutorul acestui buffer sa
> construiesc raspunsul la cererea din userspace
>
> M-am uitat si prin surse si pe lista de discutii, insa
> tot nu mi-am dat seama care e codul pe care il caut,
> asa ca orice sugestie este binevenita.
Construiesti un bio in care precizezi:
* campul bi_bdev catre dispozitiv (obtinut cu open_bdev_excl)
* campul bi_sector cu primul sector fizic din care citesti informatiile
In cazul tau (exemplul dat de tine) bio-ul va contine 2 pagini si va
trebui alocat corespunzator. De exemplu
my_bio = bio_alloc (GFP_NOIO, 2);
In continuare folosesti bio_add_page pentru a adauga pagina cu
informatiile utile la bio. Vei seta, in prealabil, campurile bi_vcnt si
bi_idx ale bio-ului la 0.
> De asemenea, nu inteleg de ce avem nevoie de flush
> atata timp cat nu folosim un camp precum dev->data
> ca in exemplu, ci fiecare operatie din userspace
> genereaza doua bio-uri care asigura consistenta
> datelor pe partitiile fizice.
Exista mai multe niveluri de caching intre transmiterea informatiei din
user-space pana cand aceasta ajunge pe dispozitivul fizic.
O operatiei de write ajunge intai in page-cache apoi ajunge la modulul
tau, acolo se formeaza bio-urile care sunt transmise catre dispozitivul
fizic.
Exista de asemenea, un nivel de caching si la citire. Operatia de flush
va invalida toate aceste cache-uri astfel incat informatia va fi citita
_direct_ de pe dispozitiv, sau va fi scrisa _direct_ pe dispozitiv.
Razvan
More information about the pso
mailing list