11
디스크 드라이브에서 섹터를 읽는 방법을 직접 작성하려면 어떻게해야합니까?리눅스 커널에서 바이오 요청을 사용하여 섹터를 읽는 방법
다음을 시도하지만 시스템이 정지합니다.
static void read_bio()
{
struct bio *b;
struct page *p;
b = bio_alloc(GFP_KERNEL, 1);
if (!b) {
printk(KERN_INFO "bio allocation failed\n");
}
bio_init(b);
b->bi_sector = 10000;
b->bi_bdev = bd; /* "/dev/sda1" */
b->bi_end_io = bio_end_clone;
p = alloc_page(GFP_KERNEL);
if (!p) {
printk(KERN_INFO "page allocation failed\n");
}
bio_add_page(b, p, PAGE_SIZE, 0);
b->bi_private = p;
bio_get(b);
submit_bio(READ, b);
printk(KERN_DEBUG "submit read request\n");
}
나는 훨씬 더 잘 작동하는 sb_bread()를 사용해 보았습니다. 하지만 여전히 드라이버 사용자 정의 요청 기능 내에서 차단됩니다. (나는 자물쇠 때문에 그것을 추측하고있다). 내가 달성하고자하는 것은 블록에 쓰기가 일어나기 전에 블록을 읽고 싶다. 나는 블록 장치의 make_request_fn을 대체하여 이것을 처리하고있다. –