Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 读取磁盘中的块(内核编程)_C_Linux_Kernel - Fatal编程技术网

C 读取磁盘中的块(内核编程)

C 读取磁盘中的块(内核编程),c,linux,kernel,C,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_sect

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

我明白了 然后我开始为读取部分编写代码:

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);
但是我不知道我读到的数据存储在哪里。 在
结构页面中
? 还有一个小问题:
bio\u add\u page()中有一个参数长度。
这应该是字节吗?还是大块?还是别的


提前感谢

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

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

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