读Linux那些事儿之我是U盘笔记(六)

简介:

27INQUIRY 命令是最最基本的一个 SCSI 命令,,比如主机第一次探测设备的时候就要用INQUIRY命令来了解这是一个什么设备,比如scsi总线上有一个插槽插了一个设备,那么scsi主机就问它,你是scsi磁盘呢,还是scsi磁带,又或是scsiCD ROM?作为设备,它内部一

定有一段固件程序,即所谓的 firmware.它就在接收到主机的 INQUIRY 命令之后作出回答.具体应该怎么回答?当然是依据scsi 协议里规定的格式了

.具体来说设备在受到INQUIRY命令查询时,她的相应遵从scsi协议里面规定的标准格式,标准格式规定了,响应数据必须至少包含36个字节

scsi 协议里规定了,标准的 INQUIRY data  data[0],总共 8  bit,其中 bit7~bi5 被称为peripheral qualifier(三位),bit4~bit0 被称为perpheral device type(五位)20h 就表示 peripheral qualifier 这个外围设备限定符为 001b, peripheral device type这个外围设备类型则为 00h,查阅 scsi 协议可知,后者代表的是设备类型为磁盘,或者说直接访问设备,前者代表的是目标设备的当前 lun 支持这种类型,然而,实际的物理设备并没有连接在当前 lun 上;从 data[8]一直到 data[35] 28 个字节都是保存的 vendor  product 的信息,data[8]开始的8个字节可以保存 vendor 相关的信息,从16开始存放productName,不能超过 16 个字符;

 

28bcdDevice:表示的是制造商指定的产品的版本号,道上的规矩是用版本号,制造商 id 和产品 id 来标志一个设备;

bcdDevice 一共 16 ,是以 bcd的方式保存的信息,也就是说,4位代表一个十进制的数,比如0011 0110 1001 0111就代表的3697. 而在scsi 标准的INQUIRY data,data[32]data[35]被定义为保存这四个数,并且要求以ASCII码的方式保存,ASCII 码中 48 对应咱们日常的 0,49 对应 1,50 对应 2,也就是说得在现有数字的基础上加上48,或者说加上0x30.

 

30scatter/gather

   解释:她是一种用于高性能IO的标准技术.她通常意味着一种DMA传输方式,对于一个给定的数据块,她老人家可能在内存中存在于一些离散的缓冲区,换言之,就是说一些不连续的内存缓冲区一起保存一个数据块

   事实上,要玩scatter/gather,就需要一个scatterlist数组,有人管她叫散列表数组.

   use_sg 0就表示没有scatter gather list,或者说scatterlist,对于这种情况,数据将直接

传送给request_buffer或者直接从request_buffer中取得数据.而如果use_sg大于 0,那么表示

scatter gather list这么一个数组就在request_buffer,而数组元素个数正是use_sg.也就是

,srb->request_buffer里边的冬冬有两种可能,一种是包含了数据本身,另一种是包含了scatter

gather list

 对于使用scatter/gather传输的情况,request_buffer里边实际上是一个数组,每一个元素都是一个struct scatterlist的指针,而每一个scatterlist指针的 page里边包含了一些page(而不是一个page),offset里边包含的是每一个DMA buffer的总的偏移量,她由两部分组成,高位部分标志着page,低位部分标志着具体某个page 中的偏移量,高位低位由PAGE_SHIFT宏来划分,不同的硬件平台PAGE_SHIFT值不一样,因为不同的硬件平台page的大小也不一样,即这里的PAGE_SIZE 不一样,目前比较前卫的硬件平台其page size4k或者 8k,

PAGE_SHIFT 也就是12或者13,换言之,sg->offset去掉低12位或者低13位就是 page,而低 12位或者低13位恰恰是在该page内的偏移量;

 

31kmap  需要把物理地址映射到内核地址空间中来;

 

本文转自 曾永刚 51CTO博客,原文链接:http://blog.51cto.com/zyg0227/552256



相关文章
|
Ubuntu Linux Python
Tkinter错误笔记(一):tkinter.Button在linux下出现乱码
在Linux系统中,使用Tkinter库时可能会遇到中文显示乱码的问题,这通常是由于字体支持问题导致的,可以通过更换支持中文的字体来解决。
1149 0
Tkinter错误笔记(一):tkinter.Button在linux下出现乱码
Linux源码阅读笔记10-进程NICE案例分析2
Linux源码阅读笔记10-进程NICE案例分析2
Linux源码阅读笔记09-进程NICE案例分析1
Linux源码阅读笔记09-进程NICE案例分析1
|
运维 监控 中间件
Linux运维笔记 - 如何使用WGCLOUD监控交换机的流量
WGCLOUD是一款开源免费的通用主机监控工具,安装使用都非常简单,它可以监控主机、服务器的cpu、内存、磁盘、流量等数据,也可以监控数据库、中间件、网络设备
|
Unix Linux 开发工具
linux笔记 diff及patch的制作与使用
这篇文章是关于Linux系统中使用`diff`命令生成补丁文件以及使用`patch`命令应用这些补丁的详细教程和实战案例。
1305 2
linux笔记 diff及patch的制作与使用
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
919 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
安全 Linux 开发者
Linux笔记之ldd命令详解
`ldd`命令是Linux环境下一个非常实用的工具,用于显示一个程序运行时所需的共享库依赖。它帮助开发者和系统管理员快速诊断程序运行问题,特别是在处理"找不到库文件"或者"错误的库文件版本"等错误时。然而,出于安全的考虑,对于不信任的可执行文件,应该慎用 `ldd`命令,可以考虑使用其他工具如 `objdump`。总的来说,懂得如何妥善且安全地使用 `ldd`,对于维护一个稳定和高效的Linux系统来说,是非常重要的。
1283 9
Linux源码阅读笔记13-进程通信组件中
Linux源码阅读笔记13-进程通信组件中
|
消息中间件 安全 Java
Linux源码阅读笔记13-进程通信组件上
Linux源码阅读笔记13-进程通信组件上
|
Linux 开发者
Linux源码阅读笔记18-插入模型及删除模块操作
Linux源码阅读笔记18-插入模型及删除模块操作