linux - 如何在 Linux 内核中使用 bio 请求读取扇区

标签 linux kernel driver

如何创建自己的生物请求以从磁盘驱动器读取扇区?

我正在尝试以下但它卡住了系统。

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/

相关文章:

c# - 迁移到 netcore 2.0 会导致 Linux 和 Mac 上的 System.IO.Filesystem 出现问题

linux - 当另一个进程共享相同的HT内核时,为什么一个进程的执行时间更短

linux - 在ubuntu中安装供私有(private)使用的脚本

c++ - conio.h 和 linux 问题

java - com.mongodb.DBPortPool 得到错误警告 : emptying DBPortPool to/IP:27017 b/c of error using spring MongoTemplate

mongodb - 如何在 go(lang) 中连接到 mlab mongodb 数据库?

linux - 在 Linux 上从内核直接访问用户内存

linux - GCC - 不要编译未使用的代码

linux - 如何从外部模块导出符号?

deployment - 我是否必须在 Program Files 下构建我的 LabVIEW 仪器驱动程序?