【问题标题】:Read chunks in a disk (kernel programming)读取磁盘中的块(内核编程)
【发布时间】:2015-04-30 23:20:51
【问题描述】:

我想读取磁盘的前几块。 我目前正在开发一个驱动程序,我想在磁盘的第一个块中存储(和检索)一些元数据(每个块被查询的次数)

我见过How to read a sector using a bio request in Linux kernel 然后我开始为读取部分编写代码:

struct bio *bio = bio_alloc(GFP_NOIO, 1);
struct page *page =  alloc_page(GFP_KERNEL)
struct completion event;
bio->bi_bdev = conf->disks[0].rdev;
bio->bi_sector = (sector_t) 0; 
bio_add_page(bio, page, (sizeof(struct nuda_table)) * conf->nbr_chunk, 0);
init_completion(&event);            
bio->bi_private = &event;
bio->bi_end_io = readComplete;

submit_bio(READ | REQ_SYNC, bio);
wait_for_completion(&event);
bio_put(bio);

但是我不知道我读取的数据存储在哪里。 在struct page 中? 其他小问题:bio_add_page() 中有一个参数长度,这是假设为字节吗?还是大块?还是其他的?

提前谢谢你

【问题讨论】:

    标签: c linux kernel


    【解决方案1】:

    page_address 将返回一个指针 (void*),您可以使用它来读取或写入页面的内容。但是,如果它是高内存中的页面,则只有在该页面被映射时才有效。

    使用 kmap 可能更可取,因为它会为您进行检查:

    void *kmap(struct page *page)
    {
            might_sleep();
            if (!PageHighMem(page))
                   return page_address(page);
            return kmap_high(page);
    }
    

    【讨论】:

      猜你喜欢
      • 2014-04-17
      • 2011-08-25
      • 1970-01-01
      • 2015-07-19
      • 2012-11-05
      • 2011-06-25
      • 2010-12-31
      • 1970-01-01
      • 2013-07-19
      相关资源
      最近更新 更多