Nvme Probe 主要功能就是初始画探测pcie总线上的设备 并将该设备初始化建立连接,方便后期host 和 device 之间的数据通信 开始之前思考问题 : 初始化流程是什么样子的? 在nvme 控制器初始话之前做了哪些工作,初始化后有做了哪些工作,为什么这样做呢? 1 Nvme Probe 流程 开胃前菜 主要数据结构介绍 struct device st...
//一、nvme_probe介绍 static int nvme_probe(struct pci_dev *pdev, const struct pci_device_id *id) { int node, result = -ENOMEM; struct nvme_dev *dev; unsigned long quirks = id->driver_data; size_t alloc_size; node = dev_to_node...
直接进入主题,打开Pci.c找到nvme_probe函数(因为是真正干活的,所以代码有点长): static int nvme_probe(struct pci_dev *pdev, const struct pci_device_id *id) { int node, result = -ENOMEM; struct nvme_dev *dev; // 通过调用dev_to_node 得到这个pci_dev的numa节点,如果没有制定的话,默认用first...
Nvme盘是一个pcie设备,因此入口是pcie驱动probe函数:nvme_probe Probe函数通过 queue_work(nvme_workq, &dev->reset_work); 调用nvme_reset_work函数 这个函数初始化nvme盘的admin和io队列(struct nvme_queue),同时初始化nvme盘的管理队列和请求队列对应的硬件队列描述结构blk_mq_tag_set,注意:这里的请求队列结构...
.probe = nvme_probe, .remove = nvme_remove, .shutdown = nvme_shutdown, .driver = { .pm = &nvme_dev_pm_ops, }, .sriov_configure = nvme_pci_sriov_configure, .err_handler = &nvme_err_handler, }; 这样PCI bus上就多了一个pci_driver nvme_driver。当读到一个设备的class code是0108...
我们可以从结构体nvme_driver中得知,驱动的名字是nvme;初始化函数是nvme_probe,该函数负责在驱动加载时候探测总线上的硬件设备;设备与驱动的关联表为nvme_id_table,通过这个表内核可以知道哪些设备是通过这个驱动来工作的;probe函数,该函数用来初始化设备;remove函数,当前驱动从内核移除时候被调用;shutdown函数用于关闭...
在分析关键函数spdk_nvme_probe()之前,让我们先搞清楚两个问题: 问题1: 每一块NVMe固态硬盘里都一个控制器(Controller), 那么发现的所有NVMe固态硬盘(也就是NVMe Controllers)以什么方式组织在一起? 问题2: 每一块NVMe固态硬盘都可以划分为多个NameSpace (类似逻辑分区的概念), 那么这些NameSpace以什么方式组织在...
在nvme_impl.h文件里面注册一下自己的callback函数,内容包括内存申请,内存映射,PCI参数和空间配置。 NVMe初始化 如下图,看起来是用户调用nvme_probe函数,相当于注册了驱动。NVMe驱动自动完成加载,Identify,创建队列等,通过Callback函数回调告诉用户结果。最后,用户根据namespace情况创建块设备。
static int nvme_probe(struct pci_dev*pdev, const struct pci_device_id *id) { int node, result = -ENOMEM;struct nvme_dev *dev;node = dev_to_node(&pdev->dev);//获取node节点,与NUMA系统有关。if (node == NUMA_NO_NODE)set_dev_node(&pdev->dev, 0);dev = kzalloc_node(sizeof(*...
NVMe协议定义了一组接口函数,用于访问和管理NVMe设备。以下是NVMe协议接口的一些常见定义: 1. nvme_ctrlr_probe:用于检测和初始化NVMe控制器。 2. nvme_ctrlr_delete:用于删除NVMe控制器。 3. nvme_ns_identify:用于获取NVMe命名空间的信息,例如容量、标识符等。 4. nvme_ns_cmd_read:用于从NVMe命名空间中读取...