ZBLOG

block_device 和bio操作nvme设备实现读和写demo

下面是一个简单的示例代码,展示了如何使用block_devicebio来实现对NVMe设备的读写操作。

#include <linux/fs.h>
#include <linux/genhd.h>
#include <linux/nvme.h>

struct block_device *nvme_blkdev = NULL;

// 初始化NVMe块设备
int nvme_block_init(void)
{
    nvme_blkdev = blkdev_get_by_path("/dev/nvme0n1", FMODE_READ | FMODE_WRITE, NULL);
    if (IS_ERR(nvme_blkdev)) {
        pr_err("Failed to get NVMe block device\n");
        return PTR_ERR(nvme_blkdev);
    }

    return 0;
}

// 释放NVMe块设备
void nvme_block_cleanup(void)
{
    if (nvme_blkdev) {
        blkdev_put(nvme_blkdev, FMODE_READ | FMODE_WRITE);
        nvme_blkdev = NULL;
    }
}

// 从NVMe设备读取数据
int nvme_read_data(char *buffer, sector_t sector, unsigned int sectors)
{
    struct bio *bio;
    struct page *page;
    int ret = -EIO;

    // 创建BIO请求
    bio = bio_alloc(GFP_KERNEL, sectors);
    if (!bio) {
        pr_err("Failed to allocate BIO\n");
        return ret;
    }

    // 设置读取操作的偏移量和长度
    bio->bi_iter.bi_sector = sector;
    bio_set_dev(bio, nvme_blkdev);
    
     // 分配页面,并将其映射到BIO中
     page = alloc_page(GFP_KERNEL);
     if (!page) {
         pr_err("Failed to allocate page\n");
         bio_put(bio);
         return ret;
     }
     bio_add_page(bio, page, PAGE_SIZE, 0);

    // 提交读取请求
    submit_bio(READ | REQ_SYNC, bio);

    // 等待IO完成
    wait_on_bio(bio);

    if (bio_flagged(bio, BIO_UPTODATE)) {
        // 将数据从页面复制到缓冲区
        memcpy(buffer, kmap(page), sectors * KERNEL_SECTOR_SIZE);
        kunmap(page);
        ret = 0;
    }

    // 释放资源
    __free_page(page);
    bio_put(bio);

    return ret;
}

// 向NVMe设备写入数据
int nvme_write_data(const char *buffer, sector_t sector, unsigned int sectors)
{
    struct bio *bio;
    struct page *page;
    int ret = -EIO;

   // 创建BIO请求
   bio = bio_alloc(GFP_KERNEL, sectors);
   if (!bio) {
       pr_err("Failed to allocate BIO\n");
       return ret;
   }

   // 设置写入操作的偏移量和长度
   bio->bi_iter.bi_sector = sector;
   bio_set_dev(bio, nvme_blkdev);

   // 分配页面,并将其映射到BIO中
   page = alloc_page(GFP_KERNEL);
   if (!page) {
       pr_err("Failed to allocate page\n");
       bio_put(bio);
       return ret;
   }
  
  memcpy(kmap(page), buffer, sectors * KERNEL_SECTOR_SIZE);
  kunmap(page);

  // 添加页面到BIO中并提交写入请求 
  submit_bio(WRITE | REQ_SYNC, bio);

  // 等待IO完成
  wait_on_bio(bio);

  if (bio_flagged(bio, BIO_UPTODATE))
      ret = 0;

  // 释放资源
  __free_page(page);
  bio_put(bio);

  return ret;
}

这是一个简单的示例,用于展示如何使用block_devicebio来读写NVMe设备。请注意,代码中的错误处理可能需要根据实际情况进行适当修改。在实际应用中,您还需要添加适当的初始化和清理函数,并根据需求进行错误处理和数据验证。

此外,请确保在使用Linux内核提供的块设备接口之前,已正确安装并配置了相关的驱动程序,并且有足够的权限访问NVMe设备(例如,通过sudo命令运行程序)。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://sdn.0voice.com/?id=4187

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?