在linux中scsi通用(sg)驱动程序如何选择使用低级驱动程序(sd或sr)

问题描述 投票:0回答:1

在linux中,scsi通用(sg)驱动程序如何选择使用低级驱动程序(sd或sr)。我发现 sg 驱动程序从查询命令获取设备类型。

sdev->type = (inq_result[0] & 0x1f);

之后调用“scsi_sysfs_add_sdev”函数。我在这个函数中没有看到任何字段“->type”的使用。

linux-kernel usb driver disk scsi
1个回答
0
投票

Sg 不会通过这些驱动程序。

Sg、Sd、Sr 和 st 都是“高层”scsi 驱动程序。它们与 SCSI 中间层通信,而 SCSI 中间层又与较低层驱动程序(例如 libata)通信。我相信这意味着路由决策是由中间层驱动程序做出的,但我可能是错的,如果是这样,希望得到纠正。

有关 scsi 中间层的更多信息,请参阅

https://docs.kernel.org/driver-api/scsi.html

Linux SCSI子系统的设计

SCSI子系统采用三层设计,即上、中、下层。涉及 SCSI 子系统的每个操作(例如从磁盘读取扇区)在 3 个级别中的每一层都使用一个驱动程序:一个上层驱动程序、一个下层驱动程序和 SCSI 中间层。

SCSI上层以块和字符设备节点的形式提供用户空间和内核之间的接口,用于I/O和ioctl()。 SCSI 底层包含特定硬件设备的驱动程序。

中间是 SCSI 中间层,类似于 IPv4 堆栈等网络路由层。 SCSI 中间层在上层的 /dev 节点和下层的相应设备之间路由基于数据包的数据协议。它管理命令队列,提供错误处理和电源管理功能,并响应 ioctl() 请求。

有关SG设计的更多信息,作者有一个极其深入的页面。

https://sg.danny.cz/sg/sg_v40.html#__RefHeading___Toc1546_4294551682

4 sg driver 架构

Linux SCSI 子系统由三部分组成:多个上层驱动程序 (ULD)、一个中层驱动程序和多个低层驱动程序 (LLD)。上层驱动程序按 SCSI 设备类型划分:对于磁盘,ULD 为 sd,对于磁带(驱动器),ULD 为 st,对于 DVD/CDROM,ULD 为 sr,对于机柜,ULD 为 ses。在大多数情况下,sg 驱动程序被视为 ULD,但是在一种情况下:当 LLD 或用户设置 no_uld_attach 标志(请参阅 include/scsi/scsi_device.h)时,该设备将被附加(即接收该设备的 sg 设备节点)。将 /dev/sg(其中 是从 0 开始的整数))发送到 sg 驱动程序,但不发送到其他 ULD。连接到 sg 驱动程序的 SCSI 设备可被视为来自所有其他 ULD 的设备以及不支持特定类型 ULD 的任何设备的联合,例如用于使用 SAFTE 协议管理机柜的处理器设备类型。中层维护 ULD 和 LLD 的接口,并提供设备发现、设备拆卸(例如关闭或挂起时)和错误处理等服务。 LLD 通常管理 SCSI 硬件(通常称为主机总线适配器 (HBA))或桥接到另一个协议栈(例如 USB 连接的 SCSI(UAS,在 USB 标准中也称为 UASP))。

© www.soinside.com 2019 - 2024. All rights reserved.