NVMe驱动开发与Linux内核适配指南
📚 共计 30 章节
01
NVMe协议概述
NVMe的诞生背景、NVMe相比AHCI的优势、NVMe协议栈架构概览。
协议基础
架构
02
Linux内核存储子系统
块设备层、I/O调度层、SCSI/ATA子系统、NVMe驱动在其中的位置。
内核
存储栈
03
NVMe驱动核心数据结构
struct nvme_dev、struct nvme_queue、struct nvme_ns、struct nvme_cmd。
数据结构
核心
04
NVMe控制器初始化
PCIe设备探测、BAR空间映射、MSI/MSI-X中断配置、控制器寄存器初始化。
初始化
PCIe
05
Admin Queue与I/O Queue创建
Admin Submission Queue与Completion Queue的创建、I/O Queue的分配与映射。
队列
Admin
06
NVMe命令提交与完成机制
SQ Tail Doorbell写入、CQ Head更新、中断处理流程。
命令
Doorbell
07
PRP与SGL机制
物理区域页(PRP)列表构建、分散聚合列表(SGL)使用、数据传输的DMA映射。
PRP
SGL
DMA
08
命名空间管理
命名空间扫描、Identify命令、命名空间容量与块大小配置。
命名空间
Identify
09
I/O请求处理路径
从bio到nvme_cmd的转换、请求队列管理、命令提交与完成回调。
I/O路径
bio
10
中断处理与Bottom Half
MSI-X中断服务例程、Tasklet与Workqueue的使用、中断负载均衡。
中断
Bottom Half
11
NVMe驱动中的锁机制
自旋锁、互斥锁、RCU锁在驱动中的应用场景与性能考量。
锁
并发
12
多队列支持与NUMA感知
每个CPU队列分配、NUMA节点绑定、队列亲和性设置。
多队列
NUMA
13
电源管理
APST(自主电源状态切换)、设备休眠与唤醒、电源状态转换流程。
电源
APST
14
错误处理与恢复
命令超时处理、控制器重置流程、错误日志读取与上报。
错误恢复
重置
15
NVMe over Fabrics(NVMe-oF)基础
FC与RDMA传输层、NVMe-oF驱动架构、连接管理。
NVMe-oF
RDMA
16
NVMe驱动调试技术
printk与dev_dbg使用、ftrace跟踪、perf性能分析。
调试
ftrace
17
内核模块编译与加载
Kbuild系统、Makefile编写、模块参数与设备树绑定。
编译
模块
18
NVMe驱动与块设备层交互
gendisk注册、request_queue设置、block_device_operations实现。
块设备
gendisk
19
IOCTL接口与用户态交互
NVMe passthrough命令、字符设备接口、用户态NVMe驱动对比。
IOCTL
用户态
20
NVMe驱动性能优化
轮询模式(IRQ-less)、写合并优化、缓存行对齐与预取。
性能
轮询
21
多路径与故障切换
NVMe多路径架构、路径发现与切换、负载均衡策略。
多路径
故障切换
22
虚拟化支持
SR-IOV与VFIO、NVMe驱动在虚拟机中的直通、vNVMe控制器实现。
虚拟化
SR-IOV
23
安全与认证
TCG Opal与NVMe安全协议、加密命令支持、TPM集成。
安全
Opal
24
NVMe驱动测试框架
blktest与fio使用、单元测试框架、自动化回归测试。
测试
fio
25
内核主线NVMe驱动代码分析
nvme-core.c、nvme-pci.c、nvme-fabrics.c关键函数解析。
源码
主线
26
NVMe驱动移植指南
不同架构(ARM64、x86_64、RISC-V)的适配要点、DMA与Cache一致性。
移植
ARM64
27
NVMe ZNS(Zoned Namespace)支持
ZNS背景、分区管理、顺序写入约束与驱动适配。
ZNS
分区
28
NVMe Key-Value存储
KV命令集、键值操作接口、与传统块存储的对比。
KV
键值
29
NVMe驱动社区协作
邮件列表、补丁提交流程、代码审查规范、Upstream策略。
社区
补丁
30
实战项目:从零编写简化NVMe驱动
功能定义、代码实现、测试验证、性能基准测试。
实战
项目