[so2] [SO2] [Tema3] [Linux] Nelămuriri - CRC, locking, checker
Liviu Ioan
liviu.andrei.ioan at gmail.com
Sun Apr 21 00:58:10 EEST 2013
> @Radu: Un bio conține o cerere care *începe* de la un anumit sector,
> eu așa înțeleg - nu m-am exprimat corect. Într-un bio, există mai
> multe segmente care alcătuiesc o zonă continuă pe disc, însă pot să
> fie discontinue în memorie. În plus, fiecare segment corespunde unei
> pagini; o singură pagină(plină) este mai mare decât un sector.
Ehm, am o rugăminte: poate confirma cineva ce i-am răspuns lui Radu :)?
Am neclarități din cauza rezolvării pentru laboratorul 8.
În rezolvare "zice"(funcția my_xfer_request din ram_disk.c):
rq_for_each_segment(bvec, req, iter) {
sector_t sector = iter.bio->bi_sector;
char *buffer = __bio_kmap_atomic(iter.bio, iter.i, KM_USER0);
my_block_transfer(dev, sector, bio_cur_bytes(iter.bio), buffer,
bio_data_dir(iter.bio) == WRITE);
__bio_kunmap_atomic(buffer, KM_USER0);
nbytes += bio_cur_bytes(iter.bio);
}
rq_for_each segment este o iterație peste bio-urile din request +
iterație peste segmentele din bio
(__rq_for_each_bio + bio_for_each_segment)
bio_cur_bytes se referă la dimensiunea segmentului curent
Al doilea parametru trimis de my_block_transfer este un offset în
cadrul "memoriei" dispozitivului.
Ce nu înțeleg eu: de ce într-un bio toate segmentele sunt scrise în
memoria dispozitivului la același offset?
Eu am crezut că un bio conține o serie de segmente care încep la bi_sector.
Concret: primul segment se referă la offset-ul bi_sector, al doilea
segment are ca offset bi_sector + dimensiunea primului segment etc.
Mai mult, în Linux Device Drivers, ch16.pdf, pag 25 din 33, există o
funcție similară(sbull_xfer_bio):
sector_t sector = bio->bi_sector;
bio_for_each_segment(bvec, bio, i) {
char *buffer = __bio_kmap_atomic(bio, i, KM_USER0);
sbull_transfer(dev, sector, bio_cur_sectors(bio), buffer,
bio_data_dir(bio) = = WRITE);
sector += bio_cur_sectors(bio);
__bio_kunmap_atomic(bio, KM_USER0);
}
Partea interesantă: sector += bio_cur_sectors(bio). Aici, fiecare
segment corespunde unui deplasament diferit.
Unde greșesc?
Mulțumesc.
Liviu
More information about the so2
mailing list