Linux内核中的UFS存储栈:从SCSI子系统到硬件交互的全链路解析
在移动设备和嵌入式系统中,UFS(Universal Flash Storage)已成为高性能存储的主流选择。作为连接SCSI子系统与物理硬件的桥梁,Linux内核中的UFS驱动栈展现了精妙的层次化设计。本文将深入剖析从SCSI命令下发到UFS硬件执行的完整路径,揭示UTRD、UCD等核心数据结构如何协同工作,为内核开发者和存储工程师提供实用的底层视角。
1. UFS驱动架构的三层模型
现代UFS驱动采用典型的分层设计,每层各司其职又紧密协作。最上层对接SCSI中间层,最下层直接操作硬件寄存器,中间层则实现通用逻辑和协议处理。
1.1 SCSI到UFS的接口转换层
当SCSI子系统通过scsi_dispatch_cmd下发命令时,UFS驱动通过ufshcd_driver_template这个struct scsi_host_template实例注册的回调函数接管处理流程。关键转换步骤包括:
- 命令封装:将SCSI CDB转换为UPIU(UFS Protocol Information Unit)格式
- 资源分配:从LRB(Local Reference Block)池中获取空闲的
ufshcd_lrb结构体 - DMA映射:为数据缓冲区建立PRDT(Physical Region Description Table)描述符
struct scsi_host_template ufshcd_driver_template = {
.name = "ufshcd",
.proc_name = "ufshcd",
.queuecommand = ufshcd_queuecommand, // 命令入口点


279

被折叠的 条评论
为什么被折叠?



