spdk关于nvme模块的实例helloword代码

简介: spdk关于nvme模块的实例helloword代码


SPDK

SPDK是一种高性能存储开发工具包,它提供了一组API,使开发人员可以利用现代存储技术来构建低延迟、高吞吐量的应用程序。其中NVMe模块是SPDK中的重要组件之一,它提供了一些API,使开发人员可以更方便地与NVMe SSD进行交互。下面是一个SPDK关于NVMe模块的实例helloworld代码,并且详细讲解一下。

代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <spdk/nvme.h>
static void
probe_cb(void *cb_ctx, const struct spdk_nvme_transport_id *trid,
         struct spdk_nvme_ctrlr_opts *opts)
{
    printf("Found NVMe controller at %!s(MISSING):%!s(MISSING)\n", trid->traddr, trid->trsvcid);
}
int main(int argc, char **argv)
{
    struct spdk_env_opts opts;
    struct spdk_env_opts_init(&opts);
    opts.name = "helloworld";
    spdk_env_init(&opts);
    struct spdk_nvme_probe_ctx *probe_ctx;
    probe_ctx = spdk_nvme_probe_init();
    if (probe_ctx == NULL) {
        fprintf(stderr, "Failed to initialize NVMe probe context\n");
        return 1;
    }
    spdk_nvme_probe_poll_async(probe_ctx, probe_cb, NULL, NULL);
    spdk_nvme_probe_wait(probe_ctx);
    spdk_nvme_probe_cleanup(probe_ctx);
    spdk_env_cleanup();
    return 0;
}

这个代码的作用是探测系统中是否存在NVMe SSD。它的执行流程如下:

  1. 初始化SPDK环境,包括初始化日志、CPU掩码、内存池等。
  2. 初始化NVMe probe的上下文,返回一个probe_ctx指针。
  3. 调用spdk_nvme_probe_poll_async函数开始异步探测NVMe控制器。这个函数会在后台进行探测,并且当探测完成时,会调用probe_cb函数。
  4. 调用spdk_nvme_probe_wait函数等待探测完成。这个函数会阻塞当前线程,直到所有异步探测都完成。
  5. 调用spdk_nvme_probe_cleanup函数清理probe_ctx指针。
  6. 清理SPDK环境。
    在这个代码中,我们使用了三个NVMe相关的函数:
  • spdk_nvme_probe_init:初始化NVMe probe的上下文。
  • spdk_nvme_probe_poll_async:异步探测NVMe控制器。
  • spdk_nvme_probe_cleanup:清理NVMe probe的上下文。

其中,spdk_nvme_probe_poll_async函数是比较重要的一个函数,它接受三个参数:probe_ctx、probe_cb和cb_ctx。其中,probe_ctx是spdk_nvme_probe_init函数返回的probe_ctx指针,probe_cb是一个回调函数,当探测完成时会被调用,cb_ctx是一个回调函数的上下文参数。在这个例子中,我们将cb_ctx设置为NULL,没有使用它。

在probe_cb回调函数中,我们只是简单地输出了探测到的NVMe控制器的地址和服务ID。实际上,我们可以在这个回调函数中执行更多的操作,比如初始化NVMe命名空间、创建I/O队列等。

这个代码虽然很简单,但是它演示了如何使用SPDK的NVMe模块探测系统中的NVMe SSD。这个代码也为后续的NVMe应用程序开发奠定了基础。

推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习

相关文章
|
6月前
|
固态存储 内存技术 NoSQL
基础代码NVMe模块的实例helloworld代码
基础代码NVMe模块的实例helloworld代码
|
23天前
|
存储 Go 文件存储
M.2移动硬盘打造Win To Go系统:高效分区存储文件全攻略
【10月更文挑战第12天】本文详细介绍了如何使用M.2移动硬盘制作Win To Go系统。首先,需准备合适容量与接口类型的M.2硬盘及硬盘盒,并获取Windows镜像文件和分区工具。接着,通过Rufus软件将镜像写入硬盘。文中还提供了分区策略,包括系统分区(约80-120GB)、软件分区(根据需求设定)和数据分区(剩余空间),并指导如何使用DiskGenius或Windows自带工具进行分区。最后,强调了对各分区文件的有效管理和定期备份的重要性。
|
6月前
|
测试技术
【ZYNQ】ZYNQ7000 私有定时器及其驱动应用示例
【ZYNQ】ZYNQ7000 私有定时器及其驱动应用示例
132 0
|
6月前
|
固态存储 网络协议 Linux
SPDK NVMe-oF Target
SPDK NVMe-oF Target
SPDK NVMe-oF Target
|
6月前
|
固态存储 API 内存技术
多看看spdk代码学习
多看看spdk代码学习
|
Android开发 异构计算
nios ii FIFO读取FPGA数据交互实验1
nios ii FIFO读取FPGA数据交互实验1
255 0
nios ii FIFO读取FPGA数据交互实验1
驱动开发:通过ReadFile与内核层通信
驱动与应用程序的通信是非常有必要的,内核中执行代码后需要将其动态显示给应用层,但驱动程序与应用层毕竟不在一个地址空间内,为了实现内核与应用层数据交互则必须有通信的方法,微软为我们提供了三种通信方式,如下先来介绍通过`ReadFile`系列函数实现的通信模式。
323 0
驱动开发:通过ReadFile与内核层通信
|
Linux 编译器 C语言
LVGL V8.2 嵌入式Linux平台使用tslib实现输入接口(以SSD212为例)
LVGL V8.2 嵌入式Linux平台使用tslib实现输入接口(以SSD212为例)
336 0
字符块设备驱动程序框架---已测试程序hello为例
字符块设备驱动程序框架---已测试程序hello为例
78 0