ZBLOG

使用bio操作nvme块设备进行写入和读出实现dmeo

下面是一个简单的示例代码,展示如何使用BIO(块输入输出)操作NVMe块设备进行写入和读取:

#include <linux/module.h>
#include <linux/init.h>
#include <linux/bio.h>
#include <linux/nvme.h>

struct nvme_ctrl *ctrl;  // NVMe控制器实例

// 块设备写入函数
void write_to_nvme(void)
{
    struct bio *bio;
    struct page *page;
    int ret;

    // 分配BIO结构
    bio = bio_alloc(GFP_KERNEL, 1);
    if (!bio) {
        pr_err("Failed to allocate BIO\n");
        return;
    }

    // 分配页,并将数据写入页面中
    page = alloc_page(GFP_KERNEL);
    if (!page) {
        pr_err("Failed to allocate page\n");
        bio_put(bio);
        return;
    }
    
	// 将数据复制到页面中
	strcpy(page_address(page), "Hello, NVMe!");

	// 添加页面到BIO中
	bio_add_page(bio, page, PAGE_SIZE, 0);

	// 设置BIO相关属性
	bio->bi_iter.bi_sector = 0;   // 起始扇区号
	bio_set_dev(bio, &ctrl->device->dev);  // 设置设备
	
	// 提交写入操作给NVMe驱动程序
	ret = nvme_submit_bio(bio);
	if (ret) {
	    pr_err("Failed to submit BIO: %d\n", ret);
	    bio_put(bio);
	    __free_page(page);
	    return;
	}

	pr_info("Write operation submitted successfully\n");
}

// 块设备读取函数
void read_from_nvme(void)
{
    struct bio *bio;
    struct page *page;
    int ret;

    // 分配BIO结构
    bio = bio_alloc(GFP_KERNEL, 1);
    if (!bio) {
        pr_err("Failed to allocate BIO\n");
        return;
    }

    // 分配页用于存储读取的数据
    page = alloc_page(GFP_KERNEL);
	if (!page) {
		pr_err("Failed to allocate page\n");
		bio_put(bio);
		return;
	}

	// 添加页面到BIO中
	bio_add_page(bio, page, PAGE_SIZE, 0);

	// 设置BIO相关属性
	bio->bi_iter.bi_sector = 0;   // 起始扇区号
	bio_set_dev(bio, &ctrl->device->dev);  // 设置设备

	// 提交读取操作给NVMe驱动程序
	ret = nvme_submit_bio(bio);
	if (ret) {
	    pr_err("Failed to submit BIO: %d\n", ret);
	    bio_put(bio);
	    __free_page(page);
	    return;
	}

	pr_info("Read operation submitted successfully\n");

	// 等待操作完成,并打印读取的数据
	ret = bio_wait_io(bio);
	if (ret) {
	    pr_err("Error waiting for IO completion: %d\n", ret);
	    goto cleanup;
	}

	pr_info("Read data: %s\n", (char *)page_address(page));

cleanup:
	bio_put(bio);	
	free_page((unsigned long)page);
}

static int __init nvme_demo_init(void)
{
	int ret;

	ctrl = nvme_get_ctrl_by_path("/dev/nvme0n1"); // 按需修改设备路径

	if (!ctrl) {
	    pr_err("Failed to get NVMe controller\n");
	    return -ENODEV;
	}

	ret = nvme_reset_ctrl(ctrl);  // 可选的重置控制器操作
	if (ret) {
	    pr_err("Failed to reset NVMe controller: %d\n", ret);
	    return ret;
	}

	write_to_nvme();
	read_from_nvme();

	return 0;
}

static void __exit nvme_demo_exit(void)
{
	nvme_put_ctrl(ctrl);
}

module_init(nvme_demo_init);
module_exit(nvme_demo_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("NVMe demo");

请注意,上述代码只是一个简单示例,并未考虑错误处理和边界情况。在实际应用中,你可能需要进行更多的错误检查和处理。另外,请根据实际环境修改设备路径(/dev/nvme0n1)以及其他参数。


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

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?