Scsi里面的父设备target是有channel和id虚拟出来的 , 没有任何休眠唤醒动作 。
爷爷辈设备host从属于上一级驱动 , 前面说的sata是其中一种 。sata也有更上一级的pcie相关的父设备 。在手机里host的上一级也可能是ufs驱动 。拿ufs为例 , 在子设备驱动休眠后 , 爷爷辈驱动的功耗相关的函数会被linux设备驱动模型触发 , 也就是ufs的suspend函数会让device和host的link状态进入hibernate8低功耗状态 。
至于resume , runtime PM各位自己可以去阅读研究 。
6.底层驱动注册前面说了 , 没有纯粹的scsi控制器 , 现实的控制器是sata , ufs这些把scsi封装在自定义的通讯结构中的控制器 。因此linux scsi提供一套用于scsi和各种实际控制器驱动交互的钩子函数模板scsi_host_template 。
例如ufs驱动中注册了这套模板

文章插图
这些钩子函数由scsi主动调用 , scsi并不关注这些钩子的实现 , 例如ufshcd_queuecommand , 用于接收scsi发下来的请求 , 并把scsi命令封装到upiu中并发送给硬件host控制 。scsi不关心ufs驱动如何封装scsi命令 , 如何触发硬件发送命令 。
7.关于channel和id的使用前面说了channel和id没有在scsi协议文档里面找到对应描述 , scsi里面也没有对target(channel+id)特别的操作 , 而是直接给host驱动去处理 。这样驱动可以自由定义channel和id 。Host驱动在申请scsi_host时会定义该驱动支持多少个channel和每个channel支持多少个id , 例如:
- ufs驱动支持一1个channel和1个id

文章插图
因此对ufs驱动而言 , ufs只需要关注lun , 忽略channel和id的存在 , 通篇ufshcd.c中看不到channel和id的处理 。
- sata驱动里面 , 支持2个channel , 16个id , 每个id下面就1个lun

文章插图
在这个驱动里面有channel和id的相关操作

文章插图
在driver/scsi目录下搜索max_channel和channel , 可以看到各种各样的用法 , 这些在scsi这层没有规定 , 完全取决于host驱动根据自身的情况来选择合适的用法 。
8.标准外设驱动scsi定义了很多组命令 , 除了一些common的scsi命令外 , 也对具体类型的外设定义了一些命令标准 。
针对不同的外设 , scsi子系统里面也集成了一些公版驱动 , 如下

文章插图
(1) Sd.c由于sd.c比较常用 , 这里把sd.c单独拿出来描述下 , 其余的外设驱动都大同小异 , 不再复述 。Sd.c它操作的是硬盘 , ssd等以sect为单位进行读取写入的存储设备 。
- 该驱动的名字是“sd” ,
- ”sd”内部创建了一个”scsi_disk”的class

文章插图
- “sd”会针对每个匹配上的sdev_gendev , 做alloc_disk和device_add_disk操作 。也就是说在user空间创建对应的块设备节点 , 例如sda , sdb这些节点 。
- “sd”也会在”scsi_disk”class上创建和sdev_gendev同名的device , 会有对应group attr和其对应做一些操作 。
- 关于sd设备驱动特别说明Sd设备驱动本身是块设备驱动 , 它需要使用block相关的request_queue来发送块设备相关请求给lun , 前面讲到lun和host之间的沟通是通过block层来完成的 , 每个lun有自己独有的request_queue , 因此sd驱动直接把这个request_queue拿来用之 , 把这个request_queue和本地申请的alloc_disk进行绑定 。sda , sdb这些块设备就可以直接通过request_queue给lun发送请求 。

文章插图
(2) Sg.cSg.c比较特殊 , 不是对某个类型的设备驱动 。它不管三七二一 , 对所有挂到“scsi_device”class上的device , 都创建一个char类型的设备节点到user空间 。由于所有被扫描出来的lun会有一个sdev_dev在”scsi_device”上 , 因此sg实际上是给每个lun创建了char设备节点 。
推荐阅读
- linux之间传文件命令之Rsync傻瓜式教程
- 微软提交补丁,用Linux替代Hyper-V根分区的Win
- 借助 HTTP 通过 SSH 绕过 Linux 防火墙
- Linux或者Mac下命令行speedtest测试网络速度
- 硬盘有必要分区吗?MacOS、Linux都不分区
- linux中ELF格式二进制程序
- 利用这个 USB ID 仓库识别更多 Linux 上的设备
- Linux内核虚拟内存管理之匿名映射缺页异常分析
- 在Linux中使用Bashtop与Bpytop监管系统资源
- Linux驱动-互斥锁用法,建议先保存
