首页 > 系统相关 >linux 内核-nvme driver

linux 内核-nvme driver

时间:2024-11-02 09:47:22浏览次数:3  
标签:初始化 函数 流程 总线 nvme driver linux NVMe 设备

创建NVMe块设备

对于Linux的块设备来说,其主要的是通过device_add_disk或者add_disk函数(后者是对前者的简单包装)来向操作系统添加一个设备实例。具体原理我们在之前的文章中已经介绍过,本文不再啰嗦了,想了解的同学请自行翻阅一下历史文章。其基本原理就是通过调用该函数,就会创建在/dev目录下看到的类似sdX的块设备。

NVMe本身也是块设备,自然也不会跳出这个大框架。首先从硬件层面上,我们知道任何设备必须通过某个总线与CPU向连接,NVMe则正是通过PCIe总线与CPU相连。

图1 Linux内核的总线架构

当然,目前NVMe除了可以通过PCIe总线与CPU相连外,还可以通过其它通道连接,比如FC或者IB。后者则是一种将NVMe设备从计算节点独立出来的方式,也就是此时NVMe就不再是一个卡设备,而是一个独立机箱的设备。无论何种方式相连接,其本质是一样等。

然后是操作系统软件层面的内容。硬件的连通性是基础,当硬件已经连通后,就可以在Linux内核层面发现设备,并进行初始化了。软件层面的初始化有两种情况,一种是计算机启动的时候,操作系统会扫描总线上的设备,并完成初始化;另外一种情况是设备在系统启动后连接的,此时需要手动触发扫描的过程。

无论是系统启动也好,还是手动触发扫描也好,NVMe发现设备的核心流程是一样的。

图2 设备初始化主流程

与其它块设备类似,NVMe设备初始化完成后会在/dev目录下出现一个文件。NVMe设备会出现一个形如nvmeXnY的设备文件。如图3所示,红色方框中的为一个NVMe块设备。

图3 Linux中的NVMe块设备

核心实现分析

上面我们简要的介绍了初始化的主流程。在上面初始化流程中需要重点关注的是nvme_alloc_ns函数的流程。该函数完成了块设备创建、基本信息填充和块设备注册到内核等工作。如图4是该函数的部分代码片段。这部分片段完成了函数指针的初始化、命令队列初始化和设备名称的初始化等工作。具体关于nvme_alloc_ns函数源代码的逻辑请自行阅读代码,本文不再赘述。

图4 代码初始化

在整个初始化流程中比较关键的是对请求队列(request_queue)中请求处理函数指针(make_request_fn)的初始化及多队列函数集(mq_ops)的初始化。因为,这里的函数正是NVMe区别于SCSI等类型设备数据处理流程的地方。

NVMe设备的IO流程

为了便于理解NVMe的处理流程,我们给出了传统SCSI及NVMe数据处理的对比流程。如图5所示,整个流程是从通用块层的接口(submit_bio)开始的,这个函数大家都非常清楚了。

图5 NVMe数据流程

对于NVMe设备来说,在初始化的时候初始化函数指针make_request_fn为nvme_queue_rq,该函数就是NVMe驱动程序的请求处理接口。该函数最终会将请求写入NVMe中的SQ队列当中,并通知控制器处理请求。

标签:初始化,函数,流程,总线,nvme,driver,linux,NVMe,设备
From: https://blog.csdn.net/lwexin/article/details/143446489

相关文章

  • Linux中的rm命令详解
    `rm`命令用于在Unix和Linux系统中删除文件和目录。以下是一些常用的`rm`命令选项和用法:1.**删除单个文件**:  ```bash  rmfilename  ```2.**删除多个文件**:  ```bash  rmfile1file2file3  ```3.**强制删除文件**(不提示):  ```bash......
  • 如何在Linux下部署自己的ZFile开源网盘
    ZFile项目介绍ZFile是一个功能强大、灵活的开源网盘系统,为用户提供安全便捷的文件存储和共享方案。项目概述ZFile由ZFile,Inc.开发和维护,基于Docusaurus构建。其用户友好的界面支持多种文件存储和共享功能,并具备高度的可定制性和扩展性,以适应各种使用场景。功能特点Z......
  • Linux
    ls命令详解ls命令(list)可用于列出指定路径下的文件(Linux中一切皆文件,目录也是文件的一种),如果不指定路径,单独运行ls命令,则默认路径为当前路径。使用方式ls[-options][targetpath]注:-a-l=-al得到的不同的文件颜色代表了不同的文件类型常见选项选项作用-a显示......
  • linux中软连接和硬链接的区别是什么
    在Linux操作系统中,软链接和硬链接是两种不同的文件链接机制,各有其独特的属性和用途。1、链接类型;2、目标对象;3、磁盘使用:软链接自身是一个文件,占用额外磁盘空间,而硬链接不占用额外磁盘空间。在硬链接的应用场景中,由于硬链接是对文件数据块的直接引用,因此它们在数据备份和同步方面......
  • Linux进程控制
    目录1.进程创建1.1.fork()函数常规用法1.2.fork()函数创建失败的原因 2.进程退出 2.1退出码2.2将错误码转化为错误描述 2.2.1利用系统自带的方法进行转化2.2.2自定义的方式2.3普通函数的返回值2.4错误码2.4.2错误码和退出码的区别 2.5进程退出的几种情况2.6......
  • 并查集---Linux发行版的数量
    题目描述Linux操作系统有多个发行版,distrowatch.com提供了各个发行版的资料。这些发行版互相存在关联,例如Ubuntu基于Debian开发,而Mint又基于Ubuntu开发,那么我们认为Mint同Debian也存在关联。发行版集是一个或多个相关存在关联的操作系统发行版,集合内不包含没有关联的发行......
  • 《Linux系统编程篇》fork/wait/waitpid/exit函数——基础篇
    文章目录引言fork()函数概述父子进程兄弟进程fork函数fork()的常见问题fork()的优势与限制引入`wait`和`waitpid`(解决僵尸进程)wait函数waitpid函数:exit函数结论命为志存。——朱熹引言《Linux系统编程篇》——基础篇首页传送门本节我们正式进入Linux的进......
  • 《Linux系统编程篇》消息队列(Linux 进程间通信(IPC))——基础篇
    文章目录引言消息队列(MessageQueue)消息队列的特点消息队列的特性消息队列的操作ipcs-q拓展ipcrm拓展注意事项结论“山重水复疑无路,柳暗花明又一村。”——陆游引言《Linux系统编程篇》——基础篇首页传送门想象一下,你正在开发一个多任务处理的应用程序,其中......
  • Chromium127编译指南 Linux篇 - 同步第三方库以及Hooks(六)
    引言在成功克隆Chromium源代码仓库并建立新分支之后,配置开发环境成为至关重要的下一步。这一过程涉及获取必要的第三方依赖库以及设置钩子(hooks),这些步骤对于确保后续的编译和开发工作能够顺利进行起着决定性作用。本指南旨在详细阐述这些配置步骤的执行方法,为开发者提供清晰......
  • Chromium127编译指南 Linux篇 - 编译前环境搭建(一)
    前言在当前的浏览器开发中,Chromium作为一个开源项目,已经赢得了广泛的关注和使用。它不仅构成了GoogleChrome的核心框架,同时也是诸如MicrosoftEdge、Opera和Brave等多款浏览器的基础。凭借其广泛的应用和出色的可定制性,许多开发者选择在Chromium的基础上进行再开发......