作者热门文章
- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
如何创建自己的生物请求以从磁盘驱动器读取扇区?
我正在尝试以下但它卡住了系统。
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");
}
最佳答案
这是一个老问题,但无论如何这里是阅读代码,我希望它能帮助别人:
int readPage(struct block_device *device, sector_t sector, int size,
struct page *page)
{
int ret;
struct completion event;
struct bio *bio = bio_alloc(device, 1, REQ_OP_READ, GFP_NOIO);
bio->bi_iter.bi_sector = sector;
bio_add_page(bio, page, size, 0);
init_completion(&event);
bio->bi_private = &event;
bio->bi_end_io = readComplete;
submit_bio(bio);
wait_for_completion(&event);
ret = test_bit(BIO_UPTODATE, &bio->bi_flags);
bio_put(bio);
return ret;
}
对于写作:
void writePage(struct block_device *device,
sector_t sector, int size, struct page *page)
{
struct bio *bio = bio_alloc(device, 1, REQ_OP_WRITE, GFP_NOIO);
bio->bi_iter.bi_sector = sector;
bio_add_page(bio, page, size, 0);
bio->bi_end_io = writeComplete;
submit_bio(bio);
}
page
可以用 alloc_page(GFP_KERNEL) 分配。此外,要更改 page
中的数据,请使用 page_address(page)
。它返回 void*
,因此您可以将该指针解释为您想要的任何内容。
关于linux - 如何在 Linux 内核中使用 bio 请求读取扇区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12720420/
我是一名优秀的程序员,十分优秀!