gpt4 book ai didi

linux-kernel - 创 build 备映射器目标

转载 作者:行者123 更新时间:2023-12-04 14:00:26 27 4
gpt4 key购买 nike

我试图通过引用已经存在的 dm-linear、dm-snapshot、dm-cache 等来实现设备映射器目标。在我的实现中,我需要对某个扇区范围执行读/修改/写操作。由于设备映射器直接与块层对话,我不确定使用什么数据结构/函数来读取内存中的扇区、修改缓冲区并将其写回另一个扇区范围。
在应用程序级别,我们有系统调用,在下面我们有 vfs_read/vfs_write。设备映射器层有没有类似的东西?
我已经被困在这里很长时间了。任何帮助将不胜感激。

最佳答案

注意:我的回答与内核版本 < 3.14 相关,因为 3.14 API 略有变化。

在内核中,您使用 struct bio 读/写某些扇区.此结构用于所有块级 I/O。可以找到全面的文档 in kernel并在 lwn .这些是这个结构的几个最重要的成员:

  • bio->bi_sector - 块 I/O 请求的第一个扇区
  • bio->bi_size - I/O 请求的大小
  • bio->bi_bdev - 读/写设备
  • bio->bi_end_io - 内核将在请求结束时调用的回调

  • 您在设备映射器目标中所做的是 map 传入bio .创 build 备映射器目标时,您至少提供 2 个回调: ctr , 和 map .例如,最简单的设备映射器目标 dm-zero 声明它是回调 as following :
    static struct target_type zero_target = {
    .name = "zero",
    .version = {1, 1, 0},
    .module = THIS_MODULE,
    .ctr = zero_ctr,
    .map = zero_map,
    };
    map是一个关键回调——它是每个设备映射器目标的核心。 map接收传入 bio它可以用它做任何事情。例如,dm-linear 只是移动每个传入 bio 的扇区通过预定义的偏移量。看代码:
    static sector_t linear_map_sector(struct dm_target *ti, sector_t bi_sector)
    {
    struct linear_c *lc = ti->private;

    return lc->start + dm_target_offset(ti, bi_sector);
    }

    static void linear_map_bio(struct dm_target *ti, struct bio *bio)
    {
    struct linear_c *lc = ti->private;

    bio->bi_bdev = lc->dev->bdev;
    if (bio_sectors(bio))
    bio->bi_sector = linear_map_sector(ti, bio->bi_sector);
    }

    static int linear_map(struct dm_target *ti, struct bio *bio)
    {
    linear_map_bio(ti, bio);

    return DM_MAPIO_REMAPPED;
    }

    因为 map 接收到指向 bio 的指针它可以更改该指针下的值,仅此而已。

    这就是您映射 I/O 请求的方式。如果要创建自己的请求,则必须分配 bio ,填充它的扇区、设备、大小、结束回调并添加缓冲区以读取/写入。基本上,它只是几个步骤:
  • 调用 bio_alloc 来分配 bio。
  • 套装bio->bi_bdev , bio->bi_sector , bio->bi_size , bio->bi_end_io
  • 通过 bio_add_page 添加页面.
  • 调用 submit_bio .
  • 处理 bio->bi_end_io 中的结果和错误回调

  • 示例可以在 crypt_alloc_buffer 中的 dm-crypt 目标中找到功能。

    关于linux-kernel - 创 build 备映射器目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24214289/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com