scsi子系统报告()

上传人:飞*** 文档编号:22209832 上传时间:2017-11-26 格式:DOC 页数:32 大小:758.50KB
返回 下载 相关 举报
scsi子系统报告()_第1页
第1页 / 共32页
scsi子系统报告()_第2页
第2页 / 共32页
scsi子系统报告()_第3页
第3页 / 共32页
scsi子系统报告()_第4页
第4页 / 共32页
scsi子系统报告()_第5页
第5页 / 共32页
点击查看更多>>
资源描述

《scsi子系统报告()》由会员分享,可在线阅读,更多相关《scsi子系统报告()(32页珍藏版)》请在金锄头文库上搜索。

1、DFTSCSI 子系统报告设备驱动分析彭成章 路新疆 武文斌2010-7-7本次报告基于对 SCSI 子系统源代码(内核版本为 2.6.24),SCSI 体系结构模型【1】,命令模型【2】及其他相关文档的理解。目录第 1 章 前言 .31.1 实验环境 .31.2 阅读和理解代码的方法 .31.3 阅读过的文档 .31.4 将讨论哪些内容和不讨论哪些内容 .3第 2 章 SCSI 子系统概述 .32.1 整体概述 .32.2 上层 .42.3 中层 .52.4 下层 .52.5 SCSI-3 架构 .52.5.1 SCSI-3 客户-服务器模型 .62.5.2 SCSI 端口 .82.5.3

2、SCSI 设备 .82.5.4 SCSI 通信模型 .9第 3 章 Linux SCSI 子系统关键数据结构 .93.1 SCSI HOST.93.1.1 scsi host 的抽象 .123.2 SCSI DEVICE.133.2.1 scsi device 的抽象 .133.3 SCSI TARGET.153.3.1 scsi target 的抽象 .153.4 request queue.163.5 request.183.6 others.203.6.1 Scsi host driver.203.6.2 Linux 中磁盘扫描流程描述 .213.6.3 low-level 接口方法 s

3、csi_host_template .233.6.4 scsi_scan_host 函数 .253.6.5 scsi_request_fn 函数 .253.6.6 scsi_dispatch_cmd 函数 .263.6.7 scsi 设备扫描过程描述 .263.6.8 Scsi Disk 驱动 IO 回调路径分析 .28第 4 章 SCSI 子系统处理流程分析 .304.1 SCSI 启动过程分析 .304.2 SCSI 命令处理分析 .304.2.1 简单命令 .304.2.2 scsi 设备读写过程 .304.2.3 读命令 .314.2.4 写命令 .31SCSI 子系统报告提纲第 1

4、章 前言 1.1 实验环境1.2 阅读和理解代码的方法1.3 阅读过的文档1.4 将讨论哪些内容和不讨论哪些内容第 2 章 SCSI 子系统概述图 2 显示了 SCSI 子系统在 Linux 内核中的位置。内核的顶部是系统调用接口,处理用户空间调用到内核中合适的目的地的路由(例如 open、read 或 write)。而虚拟文件系统(VFS) 是内核中支持的大多数文件系统的抽象层。它负责将请求路由到合适的文件系统。大多数文件系统都通过缓冲区缓存来相互通信,这种缓存通过缓存最近使用的数据来优化对物理设备的访问。接下来是块设备驱动器层,它包括针对底层设备的各种块驱动器。SCSI 子系统是这种块设备

5、驱动器之一。图 2 SCSI 子系统在 Linux 内核中的位置2.1 整体概述 SCSI 子系统与 Linux 内核中的其他主流子系统不同,SCSI 子系统是一种分层的架构,共分为三层。顶部的那层叫做较高层,代表的是内核针对 SCSI 和主要设备类型的驱动器的最高接口。接下来的是中间层,也称为公共层或统一层。在这一层包含 SCSI 堆栈的较高层和较低层的一些公共服务。最后是较低层,代表的是适用于 SCSI 的物理接口的实际驱动器。(如图 2)图 2.1 Linux SCSI 子系统的分层架构2.2 上层SCSI 子系统的较高层代表的是内核(设备级)最高级别的接口。它由一组驱动器组成,比如块设

6、备(SCSI 磁盘和 SCSI CD-ROM)和字符设备(SCSI 磁带和 SCSI generic)。较高层接受来自上层(比如 VFS)的请求并将其转换成 SCSI 请求。较高层负责完成 SCSI 命令并将状态信息通知上层。SCSI 磁盘驱动器在 ./linux/drivers/scsi/sd.c 内实现。SCSI 磁盘驱动器通过调用 register_blkdev(作为块驱动器)进行自初始化并通过 scsi_register_driver 提供一组函数以表示所有 SCSI 设备。其中 sd_probe 和 sd_init_command 这两个函数很重要。只要有新的 SCSI 设备附加到系

7、统, SCSI 中间层就会调用 sd_probe 函数。sd_probe 函数可决定此设备是否由 SCSI 磁盘驱动器管理,如果是,就创建新的 scsi_disk 结构来表示它。sd_init_command 函数将来自文件系统层的请求转变成 SCSI 读或写命令(为完成这个 I/O 请求,sd_rw_intr 会被调用)。SCSI 磁带驱动器在 ./linux/drivers/scsi/st.c 内实现。磁带驱动器是顺序存取设备,会通过 register_chrdev_region 将自身注册为字符设备。SCSI 磁带驱动器还提供了一个 probe 函数,称为 st_probe。该函数会创建

8、一种新磁带设备并将其添加到称为 scsi_tapes 的向量。SCSI 磁带驱动器的独特之处在于,如果可能,它可以直接从用户空间执行 I/O 传输。否则,数据会通过驱动器缓冲被分段。SCSI CD-ROM 驱动器在 ./linux/drivers/scsi/sr.c 内实现。CD-ROM 驱动器是另一种块设备并为 SCSI 磁盘驱动器提供类似的函数集。sr_probe 函数可用来创建 scsi_sd 结构以表示 CD-ROM 设备,并用 register_cdrom 注册此 CD-ROM。SCSI 磁带驱动器还会导出 sr_init_command,以将请求转换成 SCSI CD-ROM 读或

9、写请求。SCSI generic 驱动器在 ./linux/drivers/scsi/sg.c 内实现。该驱动器允许用户应用程序向设备发送 SCSI 命令(比如格式化、模式感知或诊断命令)。通过 sg3utils 包还可以从用户空间利用 SCSI generic 驱动器。这个用户空间包包括多种实用工具,可用来发送 SCSI 命令和解析这些命令的响应。2.3 中层SCSI 中间层是 SCSI 较高层和较低层的公共服务层(可以在 ./linux/drivers/scsi/scsi.c 内部分地实现)。它提供了很多可供较高层和较低层驱动器使用的函数,因而可以充当这两层间的连接层。中间层很重要,原因是它抽象化了较低层驱动器(LLD)的实现,可以在 ./linux/drivers/scsi/hosts.c 中部分地实现。这意味着可以以同样的方式使用带不同接口的 Fibre Channel 主机总线适配器(HBA)。低层驱动器注册和错误处理都由 SCSI

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号