Linux系统块存储子系统分析记录
1 Linux存储栈
通过网址Linux Storage Stack Diagram - Thomas-Krenn-Wiki-en,可以获取多个linux内核版本下的存储栈概略图,下面是kernel-4.0的存储栈概略图:

2 存储接口、传输速度 和 协议
2.1 硬盘

《深入浅出SSD:固态存储核心技术、原理与实战》第2版,1.4 SSD基本工作原理,表1-5

《深入浅出SSD:固态存储核心技术、原理与实战》第2版,9.2 NVMe综述,图9-4
2.2 闪存(Flash)
2.2.1 ONFI 接口
ONFI 2.0: 133MB/s
ONFI 2.1: 166BM/s 和 200MB/s (工作模式不同则速度不同)
ONFI 3.0: 400MB/s
ONFI 4.0: 800MB/s
《固态存储:原理、架构与数据安全》5.5 闪存接口,1. ONFI
2.2.2 Toggle接口
Toggle DDR 2.0: 400MB/s
《固态存储:原理、架构与数据安全》5.5 闪存接口,2. Toggle
2.3 SDIO
3 Linux块设备⼦系统
3.1 简介
本文涉及的内核源码版本是kernel-5.4
3.1.1 功能框图

《存储技术原理分析》5.1 概述,图5-1

《Linux设备驱动开发详解:基于最新的Linux4.0内核》13.1 块设备的I/O操作特点,图13.2
3.2 通用块层 / bio layer
3.2.1 简介
In summary, the bio layer is a thin layer that takes I/O requests in the form of bio structures and passes them directly to the appropriate make_request_fn() function.
A block layer introduction part 1: the bio layer [LWN.net]
Linux通⽤块层提供给上层的接⼝函数是submit_bio。上层在构造好bio请求之后,调⽤submit_bio提交给Linux通⽤块层处理。
《存储技术原理分析》5.4 请求处理过程
当内核⽂件⼦系统需要与块设备进⾏数据传输或者对块设备发送控制命令时,内核需 要向对应块设备所属的请求队列发送请求对象。这个任务由函数submit_bio来完成。
《深⼊Linux设备驱动程序内核机制》 11.13 向队列提交请求
3.2.2 数据结构

3.3 request layer 和 I/O调度层
3.3.1 简介
接收通⽤块层发出的I/O请求,缓存请求并试图合并相邻的请求,并根据设置好的调度算法,回调驱动层提供的请求处理函数,以处理具体的I/O请求。
《存储技术原理分析》5.1 概述
3.3.2 single queue 和 Multiple queue(blk-mq)
Traditionally, most storage devices were made up of a set of spinning circular platters with magnetic coating and a single head (or set of heads, one per platter) that moved along the radius of the spinning disk to read or change the magnetic polarization at any location on any platter. Such a device can only process a single request at a time, and has a substantial cost in moving from one location on the platters to another. The single-queue implementation started out aimed at driving this sort of device and, while it has broadened in scope over the years, its structure still reflects the needs of rotating storage devices.
Block layer introduction part 2: the request layer [LWN.net]
blk-mq (Multi-Queue Block IO Queueing Mechanism) is a new framework for the Linux block layer that was introduced with Linux Kernel 3.13, and which has become feature-complete with Kernel 3.16.[1] Blk-mq allows for over 15 million IOPS with high-performance flash devices (e.g. PCIe SSDs) on 8-socket servers, though even single and dual socket servers also benefit considerably from blk-mq.[2] To use a device with blk-mq, the device must support the respective driver.
Linux Multi-Queue Block IO Queueing Mechanism (blk-mq) Details - Thomas-Krenn-Wiki-en
3.3.3 数据结构: request_queue 和 request(请求描述符)


3.3.4 Request affinity
On large, multiprocessor systems, there can be a performance benefit to ensuring that all processing of a block I/O request happens on the same CPU. In particular, data associated with a given request is most likely to be found in the cache of the CPU which originated that request, so it makes sense to perform the request postprocessing on that same CPU.
设置方式
/sys/class/block//queue/rq_affinity
If it is set to a non-zero value, CPU affinity will be turned on for that device.
Block layer: solid-state storage, timeouts, affinity, and more [LWN.net]
3.3.5 I/O调度

3.3.6 请求处理的代码流程

3.4 块设备驱动层
3.4.1 数据结构:struct blk_mq_ops;

来自上层的request最终会通过具体存储设备驱动的queue_rq()下发到存储设备上,然后存储设备会进行处理,处理完成后,存储设备会产生一个中断通知CPU,CPU在中断处理程序中进行request的完成操作。
常见存储设备驱动的queue_rq()函数:

3.4.2 request处理超时
每个request下发给存储设备后,留给存储设备的处理时间是有限的,默认是30秒,可以通过/sys/class/block/<disk>/queue/io_timeout修改。
在queue_rq()实例函数(如scsi_queue_rq())中都会调用blk_mq_start_request(),blk_mq_start_request()内核会设置定时器
blk_mq_start_request();-> trace_block_rq_issue(q, rq);-> rq->io_start_time_ns = ktime_get_ns();-> blk_add_timer(rq);-> req->timeout = q->rq_timeout;-> expiry = jiffies + req->timeout;-> mod_timer(&q->timeout, expiry);
超时处理函数为blk_mq_timeout_work,超时时间默认为30秒,超时工作项处理函数为blk_mq_timeout_work
blk_mq_init_queue(); //申请request_queue-> blk_alloc_queue_node();-> timer_setup(&q->timeout, blk_rq_timed_out_timer, 0);-> blk_mq_init_allocated_queue();-> INIT_WORK(&q->timeout_work, blk_mq_timeout_work);-> blk_queue_rq_timeout(q, set->timeout ? set->timeout : 30 * HZ);-> q->rq_timeout = timeout;
超时处理流程

具体的超时处理工作留给存储设备驱动来完成。
4 不同存储设备的request处理过程
4.1 SATA、SCSI 和 SAS类存储设备
4.1.1 请求下发的流程
scsi_queue_rq();-> blk_mq_start_request();-> scsi_dispatch_cmd();-> scsi_log_send(cmd);-> scmd_printk(..., "Send: scmd 0x%p\n", cmd);-> scsi_print_command();-> host->hostt->queuecommand();

4.1.2 存储设备处理完成,产生中断,CPU处理中断的流程
在硬件中断被引发时,中断回调函数将会被调⽤,如果是对SCSI命令的响应,则将找到对应的 scsi_cmnd描述符,低层设备驱动处理完这个请求后,调⽤保存在它⾥⾯的scsi_done函数。
《存储技术原理分析》5.6.1
在scsi_queue_rq()中,scsi_done被赋值为scsi_mq_done。
scsi_queue_rq();-> cmd->scsi_done = scsi_mq_done;
所以中断处理流程如下:
scsi_mq_done();-> trace_scsi_dispatch_cmd_done(cmd);-> blk_mq_complete_request();-> __blk_mq_complete_request(rq);-> WRITE_ONCE(rq->state, MQ_RQ_COMPLETE);-> __blk_complete_request();-> raise_softirq_irqoff(BLOCK_SOFTIRQ); //发出软中断
软中断BLOCK_SOFTIRQ的处理函数是blk_done_softirq
blk_done_softirq();-> rq->q->mq_ops->complete(rq);-> scsi_softirq_done();-> scsi_decide_disposition(cmd);-> scsi_log_completion();-> scsi_print_result(cmd, "Done", disposition);-> scsi_print_command();-> scmd_printk(..., "scsi host busy %d failed %d\n", ...);-> case SUCCESS: scsi_finish_command(cmd);-> SCSI_LOG_MLCOMPLETE( ... "Notifying upper driver of completion " ...);
4.1.3 实际的dmesg信息
打开SCSI的日志开关:echo 0xffff > /sys/module/scsi_mod/parameters/scsi_logging_level
当系统下有硬盘操作时,就会在dmesg信息里看到如下信息:
向硬盘发送命令时的dmesg信息:
sd 2:0:0:0: [sda] tag#25 Send: scmd 0x0000000049a58ebd
sd 2:0:0:0: [sda] tag#25 CDB: Write(10) 2a 00 0a 42 60 00 00 00 40 00
......
硬盘收到命令后,对命令进行处理,处理完成后产生中断通知CPU,下面是CPU处理中断时的dmesg信息:
sd 2:0:0:0: [sda] tag#25 Done: SUCCESS Result: hostbyte=DID_OK driverbyte=DRIVER_OK
sd 2:0:0:0: [sda] tag#25 CDB: Write(10) 2a 00 0a 42 60 00 00 00 40 00
sd 2:0:0:0: [sda] tag#25 scsi host busy 1 failed 0
sd 2:0:0:0: Notifying upper driver of completion (result 0)
dmesg信息简单说明
CDB: Command Descriptor Block
Write(10)是SCSI的命令,含义如下:
(更多SCSI命令,请看《SCSI Commands Reference Manual》,下载链接:https://www.seagate.com/staticfiles/support/disc/manuals/scsi/100293068a.pdf)

4.2 NVMe
4.2.1 简介
当前有很多种NVMe的实现方式,例如:
- NVMe over PCIe
- NVMe over RDMA
- NVMe over TCP
- NVMe over FC
《深⼊浅出SSD:固态存储核⼼技术、原理与实战》第2版,9.9 NVMe over Fabrics
下面以NVMe over PCIe为例,介绍request的处理流程
4.2.2 NVMe处理命令 的⼋个步骤
第⼀步,主机写命令到内存中的SQ;
第⼆步,主机写SQ的DB,通知SSD取指;
第三步,SSD收到通知后,到SQ中取指;
第四步,SSD执⾏指令;
第五步,指令执⾏完成,SSD往CQ中写指令执⾏结果;
第六步,SSD发送中断通知主机指令完成;
第七步,收到中断,主机处理CQ,查看指令完成状态;
第⼋步,主机处理完CQ中指令执⾏结果,通过DB恢复SSD。

《深⼊浅出SSD:固态存储核⼼技术、原理与实 战》第2版,9.2 NVMe综述
4.2.3 请求(命令)下发
nvme_queue_rq();-> nvme_setup_cmd();-> trace_nvme_setup_cmd();-> blk_mq_start_request();-> nvme_submit_cmd();-> memcpy(nvmeq->sq_cmds + (nvmeq->sq_tail << nvmeq->sqes), cmd, sizeof(*cmd)); //第⼀步,主机写命令到内存中的SQ;-> nvme_write_sq_db(); //第⼆步,主机写SQ的DB,通知SSD取指
4.2.4 存储设备处理完成,产生中断,CPU处理中断的流程
nvme_irq(); //第七步,收到中断,主机处理CQ,查看指令完成状态;-> nvme_process_cq();-> nvme_ring_cq_doorbell();-> nvme_complete_cqes();-> nvme_handle_cqe();-> trace_nvme_sq();-> nvme_end_request();-> blk_mq_complete_request(req);
相关文章:
Linux系统块存储子系统分析记录
1 Linux存储栈 通过网址Linux Storage Stack Diagram - Thomas-Krenn-Wiki-en,可以获取多个linux内核版本下的存储栈概略图,下面是kernel-4.0的存储栈概略图: 2 存储接口、传输速度 和 协议 2.1 硬盘 《深入浅出SSD:固态存储核心…...
大数据——本地威胁检测的全球方法
大数据似乎是众多专业人士关注的话题,从在自然灾害发生时帮助挽救生命,到帮助营销团队设计更有针对性的策略以接触新客户。 对于安全工程师来说,大数据分析被证明是抵御不断演变的网络入侵的有效防御手段,这得益于基于大量不同网…...
使用postman接口测试
一 、postman断言 1、什么是断言 postman 断言借助JavaScript -js 语言编写代码,自动判断预期结果与实际结果是否一致。 断言代码写在 Tests 的标签中。(新版本在Scripts标签中) 2、断言工作原理 3、常用断言 断言响应状态码 // 断言响应状态码 是否为 200 pm.…...
Ubuntu24.04双系统安装(Linux/windows共存一文打通)
他向远方望去,无法看到高山背后的矮山,只能看到一座座更高的山峰。 目录 编辑 一.前言 二.虚拟机和双系统比较 三.Windows/Linux双系统安装 1.Rufus-制作U盘启动盘系统工具安装 2.Ubuntu24.04下载 3.Ubuntu-u盘启动盘制作 4.压缩磁盘留足安装空…...
C++ - deque
博客主页:【夜泉_ly】 本文专栏:【C】 欢迎点赞👍收藏⭐关注❤️ 文章目录 💡双端队列简介1. 基本特性2. 与其他容器的比较与 vector与 list 3. 中控数组的设计4. 优缺点优点缺点 5. 应用场景6. 结论 💡双端队列简…...
国产!瑞芯微米尔RK357核心板革新AIoT设备,8核6T高算力
随着科技的快速发展,AIoT智能终端对嵌入式模块的末端计算能力、数据处理能力等要求日益提高。近日,米尔电子发布了一款基于瑞芯微RK3576核心板和开发板。核心板提供4GB/8GB LPDDR4X、32GB/64GB eMMC等多个型号供选择。瑞芯微RK3576核心优势主要包括高性能…...
中国人寿财险青岛市分公司践行绿色金融,助力可持续发展
中国人寿财险青岛市分公司积极响应国家绿色发展战略,大力推进绿色金融实践。在保险产品创新方面,推出一系列绿色保险产品。如新能源汽车保险,为新能源汽车产业发展提供风险保障,促进交通领域的节能减排。环境污染责任保险则助力企…...
ajax 读取文件
DOMException: Failed to read the responseXML property from XMLHttpRequest: The value is only accessible if the objects responseType is or document (was blob). at XMLHttpRequest.r ( $.ajax({ url: 未来之窗_服务, method: GET, …...
火语言RPA流程组件介绍--开始监听网络请求
🚩【组件功能】:开始监听内置浏览器网络请求(提示:本组件仅适用于火语言内置浏览器) 配置预览 配置说明 匹配网址 可以添加一个或者多个匹配规则用于筛选需要保存的网络请求. 输入输出 输入类型 万能对象类型(Sy…...
CSS综合案例——新闻详情
一、知识点 1、文字颜色 属性名:color 属性值: 颜色表示方式属性值说明使用场景颜色关键字颜色英文单词red,green,blue学习测试rgb表示法rg(r,g,b)r,g,b表示红绿蓝三原色,取值0-255了解rgba表示法rgba(r,g,b,a)a表示透明度,取…...
【【自动驾驶】车辆运动学模型】
【自动驾驶】车辆运动学模型 1. 引言2. 以车辆重心为中心的单车模型2.1 模型介绍2.2 滑移角 β \beta β 的推导2.2 航向角 ψ \psi ψ推导过程:2.3 滑移角 β \beta β2.3 Python代码实现2.4 C代码实现 3. 前轮驱动的单车模型3.1 模型介绍3.3 Python代码实现3.4 …...
叉尖避障新科技:因泰立科技ILS-T52三维深度成像激光雷达
ILS-T52三维深度成像激光雷达是一款高性能的纯固态式激光雷达,采用激光时间飞行法,提供出色的三维图像成像和深度感知功能。特别适用于无人叉车领域,为叉尖避障提供卓越的三维成像和深度感知功能。它的高精度、自适应自动曝光、小尺寸、低功耗…...
精华帖分享 | 低估值还能涨多久?
本文来源于量化小论坛策略分享会板块精华帖,作者为亮子,发布于2024年3月19日。 这两年,A股给我们的感觉就是成长股坍塌,高股息低估值的股票扛起大旗。表现出来就是中国神华、中海油这样的垄断型央国企大涨,包括移动联通…...
如何制作一个自己的网站?
在今天的互联网时代,网站展示已经是一个很基础的营销工具。不管是企业、还是个人,如何制作一个自己的网站?本文将会提供一个全面的基础制作网页教程,教你如何从零开始制作网页。 网页制作的基础知识:HTML、CSS和JavaS…...
torch报错
The Kernel crashed while executing code in the current cell or a previous cell. Please review the code in the cell(s) to identify a possible cause of the failure. Click here for more info. View Jupyter log for further details. 从日志中可以看出,内…...
深入探索卷积神经网络(CNN):图像分类的利器
深入探索卷积神经网络(CNN):图像分类的利器 前言CNN的崛起:为何我们需要它?图像卷积:CNN的基石轮廓过滤器:捕捉边缘特征 图像池化:降低维度的利器CNN的组成:卷积层、池化…...
网站建设中需要注意哪些安全问题?----雷池社区版
服务器与应用安全指南 1. 服务器安全 1.1 操作系统安全 及时更新补丁:确保操作系统始终安装最新补丁,以防范系统漏洞。例如,Windows Server 定期推送安全更新,修复如远程代码执行等潜在威胁。优化系统服务配置:关闭不…...
光控资本:养老金融建设提速 高速铜缆市场空间广阔
养老金融制作提速 金融监管总局办公厅近来印发的《关于大力展开商业保险年金有关事项的奉告》(下称《奉告》)提出,进一步扩大商业养老金业务试点;开发习惯个人养老金准则的新产品和专属产品;保险公司要坚持长期出资、…...
部署前后端分离若依项目--CentOS7宝塔版
准备: CentOS7服务器一台 通过网盘分享的文件:CentOS 7 h 链接: https://pan.baidu.com/s/17DF8eRSSDuj9VeqselGa_Q 提取码: s7x4 大家有需要可以下载这个,密码61 若依前端编译后文件 通过网盘分享的文件:ruoyi-admin.jar 链…...
ubuntu22.04 R Rstudio conda python 深大
一、配置IP network:version: 2renderer: networkdethernets:eth0:dhcp4: noaddresses:- 172.20.0.52/24gateway4: 172.20.0.2nameservers:addresses: [8.8.8.8, 8.8.4.4] 二、update apt update apt upgrade 三、安装python ubuntu 22.04安装python3 在Ubuntu 22.04上安装…...
跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...
毫米波雷达基础理论(3D+4D)
3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文: 一文入门汽车毫米波雷达基本原理 :https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...
人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent
安全大模型训练计划:基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标:为安全大模型创建高质量、去偏、符合伦理的训练数据集,涵盖安全相关任务(如有害内容检测、隐私保护、道德推理等)。 1.1 数据收集 描…...
Linux系统部署KES
1、安装准备 1.版本说明V008R006C009B0014 V008:是version产品的大版本。 R006:是release产品特性版本。 C009:是通用版 B0014:是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存:1GB 以上 硬盘…...
深入理解Optional:处理空指针异常
1. 使用Optional处理可能为空的集合 在Java开发中,集合判空是一个常见但容易出错的场景。传统方式虽然可行,但存在一些潜在问题: // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...
Docker拉取MySQL后数据库连接失败的解决方案
在使用Docker部署MySQL时,拉取并启动容器后,有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致,包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因,并提供解决方案。 一、确认MySQL容器的运行状态 …...
