文章目录

  • Usb包的总类
    • (1)令牌包
    • (2)数据包
    • (3)握手包
    • (4)特殊包
  • Usb包的事务
  • usb四种传输类型
    • 批量传输
    • 等时传输
    • 中断传输
    • 控制传输
  • usbmon的使用
    • (1)首先检测内核是否支持debugfs文件系统
    • (2)挂载debugfs文件系统
    • (3)按照usbmon内核模块
    • (4)监控usb总线上的数据
  • usbmon抓取的log含义

Usb总线上传输的数据是以包为基本单位的,但是不能随意的使用包来传输数据,必须按照一定的关系把这些不同的包组织或事务(transaction)传输。

Usb包的总类

总体上可以分为四类:令牌包、数据包、握手包、特殊包

(1)令牌包

令牌包用来发起一次usb传输,因为usb是主从结构的拓扑结构,所有的数据传输都是由主机发起的,设备只能被动的响应,这就需要主机发送一个令牌包来通知那个设备进行响应,如何响应。
令牌包有四种,分别为输出(OUT)、输入(IN)、建立(SETUP)和帧起始(SOF),如下:

令牌包类型 作用
OUT 输出令牌包用来通知设备将要输出一个数据包
IN 输入令牌包用来通知设备返回一个数据包
SETUP 建立令牌包和输出令牌包功能相同,但它只用在控制传输中,且两者有所差异
SOF 通知设备这是一个帧起始包

(2)数据包

数据包就是用来传输数据的,可以从主机到设备,也可以从设备到主机,方向由令牌包来指定。

(3)握手包

握手包的发送者一般是数据接收者,用来表示一个传输是否被对方确认。在传输正常情况下,主机/设备会发送一个表示传输正常的ACK握手包。

(4)特殊包

特殊包用在特殊的场合。

Usb包的事务

由于不能随意的使用USB包来传输数据,必须按照一定的关系把这些不同的包组织成事务才能传输数据。
事务通常由三个包组成:令牌包、数据包和握手包。

Usbmon只能抓取事务中的数据包,不会抓取令牌包和握手包。
Usb协议规定了 4 种传输类型:批量传输、等时传输、中断传输和控制传输。其中,批量传输、等时传输、中断传输每传输一次数据都是一个事务;控制传输包括三个过程,建立过程和状态过程分别是一个事务,数据过程可能包含多个事务。

usb四种传输类型

批量传输

等时传输

中断传输

控制传输

usbmon的使用

Usbmon即usb monitor,是linux内置的usb抓包工具,usbmon本质上是一个内核模块。

(1)首先检测内核是否支持debugfs文件系统


上图为支持,如果不知道,就没有输出。

(2)挂载debugfs文件系统

在ubuntu上默认已经挂载了debugfs文件系统,如果没有挂载debugfs,可以使用以下命令手动挂载:

mount -t debugfs none_debugs /sys/kernel/debug

(3)按照usbmon内核模块

执行modprobe usbmon后,可以在/sys/kernel/debug/usb/目录下找到usbmon,如下:

在usbmon目录下,有0s 0u 1s 1t 1u 2s 2t 2u 3s 3t 3u 4s 4t 4u的文件,其中1代表bus1,2代表bus2,以此类推,0代表所有usb总线。

(4)监控usb总线上的数据

首先需要获取想要监测的设备所在的总线以及设备号。linux 中查看USB设备列表以及USB设备详细信息的两种方法。
第一是lsusb命令,

第二是 cat /sys/kernel/debug/usb/devices

然后可以使用:

cat /sys/kernel/debug/usb/usbmon/4u | grep "4:004"

usbmon抓取的log含义


其中:
第一列为URB Tag(URB标签),该字段表示驱动中定义的struct urb 结构体变量在内核空间的地址,可以使用该字段区分不同的 URB 数据包。
第二列为时间戳,单位为微秒,该字段定义在内核代码driver/usb/mon/mon_text.c中:

第三列为Event Type(事件类型),其中,S - submission,向 usb controller 提交 URB;C - callback,URB 提交完成后的回调;E - submission error,向 usb controller 提交 URB 发生错误。
第四列为Address word(地址字段),这个字段由四部分组成,分别为:URB类型及方向、usb总线号、usb设备地址、端点号。

ffff91110097ca80 3209165604 S Bo:4:004:2 -115 31 = 55534243 ae040000 00000000 00000600 00000000 00000000 00000000 000000
Bo:传输类型及方向
4:usb总线号
004:usb设备号
2:端点号URB 类型及传输方向:usb 有四种传输方式,分别是控制传输(Control)、批量传输(Bulk)、等时传输(Isochronous)和中断传输(Interrupt)。usb 数据的传输方向是以 Host 端为参考对象的,Host 向 usb 设备发送数据那么传输方向就是 Output,Host 读取 usb 设备的数据那么传输方向就是 Input。
usb 总线号:该字段表示 usb 总线号,Host 端一般有多个usb controller,每个usb controller 都有一条对应的 usb 总线,使用 usb 总线号区分它们,usb 设备可以挂接到某条总线上。
usb 设备地址:该字段表示 usb 设备的地址,每一个 usb 设备经过枚举后在 Host 端都有一个唯一的地址。
端点号:表明该次数据传输是 Input/Output 到设备的哪个端点。上图中该字段是 1,就表示这次数据传输使用的是设备的端点 1(控制端点)。

第五列为URB的状态,有两种表示形式:
(1)s + 一串数字
(2)一串以分号间隔的数字(或单个数字)构成的,这串数字包含下面几个部分:URB status、interval、start frame 和 error count。特别注意一点,该字段不同于 “Address word” 字段,对于不同的传输方式这几部分是可选的,并非所有部分都是必须的,下图是不同的传输方式包含的信息。



不同传输方式所包含的信息:

批量传输:只包含 URB status 这个字段,它对应着 struct urb 结构体中的 status 成员变量,表示 URB 的状态。URB status 仅仅对 Event Type 中的 Callback 有意义,对于 Submission 是无意义的,之所以这么做是为了统一格式,方便使用脚本分析 usbmon 的 log。URB status 的具体含义见内核对于该成员变量的注释。
中断传输:URB status 和 Interval,URB status 见前面的分析,Interval 表示该 URB 对端点轮询的间隔时间。
等时传输:URB status、Interval、start frame 和 error count。等时传输包含了所有部分,start frame 和 error count 是等时传输所特有的字段,但因为我们的驱动程序中不使用等时传输这种方式,因此这里不做过多的分析。
控制传输:控制传输在提交时(S:submission)这个字段是 s,这里的 s 后面紧跟的数据是控制传输的建立过程主机发送的数据包,可以参考前面控制传输的示意图。控制传输在回调时(C:callback),这个字段代表的是 URB status。

对于控制传输,s表示建立阶段,后面跟的为建立阶段主机发送给设备的数据包。

再后一列,表示数据包的长度:

对于 S(Submission),Data Length 字段是主机请求发送/读取的数据长度,但是设备并不一定能够接收/发送主机请求的数据长度。实际接收/发送的数据长度在 C(Callback)中的 Data Length 字段。

再后一列,数据标签,”=” 后面紧跟数据流;“>” 表示这是一次 Output 数据传输;“<” 表示这是一次 Input 数据传输。
“=”后跟着的一列为数据流:这个字段就是一个事务(transaction)中的数据包,我们平时分析 usbmon 的 log 定位问题,也主要是看这个字段。注意一点,这个字段实际显示的数据 <= Data Length 的值。

usbmon---Linux下USB数据传输监控相关推荐

  1. Linux下USB抓包工具UsbMon的使用和包数据格式解析

    Linux下USB抓包工具UsbMon的使用和包数据格式解析 一.UsbMon的使用步骤 1.挂载debugfs 2.加载usbmon模块 3.确认usbmon是否可用 4.确认usb设备挂在哪条总线 ...

  2. usb linux 内核,Linux下USB内核之学习笔记

    Linux下USB子系统软件结构为 USB 内核(USB驱动,USBD )处于系统的中心,对于它进行研究是能够进行USB驱动开发(包括客户驱动和主机驱动)的第一步.它为客户端驱动和主机控制器驱动提供了 ...

  3. 嵌入式linux进行视频监控,嵌入式Linux下的视频监控解决方案

    原标题:嵌入式Linux下的视频监控解决方案 在嵌入式工控板上接一个摄像头进行视频监控,看起来比较容易实现,但往往是"理想很丰满.现实很骨感".历经千辛万苦效果却不是很理想,本文就 ...

  4. 嵌入式linux查看usb设备驱动程序,嵌入式Linux下USB驱动程序的设计

    嵌入式Linux下USB驱动程序的设计 usb概念:  USB(Universal Serial Bus)即通用串行总线,是一种全新的双向同步传输的支持热插拔的数据传输总线,其目的是为了提供一种兼容不 ...

  5. linux shell脚本攻略_(python)Linux下shell脚本监控Tomcat的状态并实现自动启动步骤...

    今天为大家带来的内容是:(python)Linux下shell脚本监控Tomcat的状态并实现自动启动步骤 本文内容主要介绍了Linux下shell脚本监控Tomcat的状态并实现自动启动的步骤,文章 ...

  6. Linux下USB suspend/resume源码分析【转】

    转自:http://blog.csdn.net/aaronychen/article/details/3928479 Linux下USB suspend/resume源码分析 Author:aaron ...

  7. Linux下用MRTG监控网络设备端口流量

    Linux下用mrtg监控网络设备端口流量 被监控设备必须支持snmp协议,因为mrtg就是通过snmp协议来获取该设备的端口流量信息.如何在一个网络设备上启用snmp协议呢? 在配置模式下执行如下命 ...

  8. linux配置usb主从_一种Linux下USB设备主从切换的实现

    龙源期刊网 http://www.qikan.com.cn 一种 Linux 下 USB 设备主从切换的实现 作者:侯景昆 来源:<电子技术与软件工程> 2013 年第 22 期 摘 要 ...

  9. linux下usb设备节点名不固定,解决Linux下USB设备节点ttyUSB名不固定的问题,生成固定USB转串口设备节点...

    解决Linux下USB设备节点ttyUSB名不固定的问题,生成固定USB转串口设备节点 2018-09-19 http://blog.sina.com.cn/s/blog_8b58097f0102wx ...

最新文章

  1. ggplot2笔记4 语法基础
  2. pytorch 查看模型参数,查看模型特定层输入输出,模型结构图绘制总结
  3. 用python写的图形计算器
  4. iis7 您无权使用所提供的凭据查看此目录或页面。_使用Spring Cloud和Docker构建微服务架构
  5. Java 理论与实践: JDK 5.0 中更灵活、更具可伸缩性的锁定机制--转载
  6. 他人的一些2017年度总结
  7. html表格td的内容修改,点击table中的td,修改td中的内容功能实现
  8. dos 初始化 mysql数据库_DOS下的MySQL数据库基本操作
  9. web项目开发最佳做法
  10. 禁止用户用手机浏览时上下滑动
  11. java压缩解压文件
  12. GEE(Google Earth Engine)批量导入谷歌云盘
  13. 关于尼德霍夫VS塔勒布: 今年赚钱最多的,居然是个牧羊人(作者:老喻)
  14. JS特效--字体逐渐浮现效果
  15. ANSYS Workbench远端位移边界条件的解析
  16. 闲鱼如何0到1搭建一套发布引导链路
  17. 【会议征稿|SPIE独立出版|往届已检索】第二届人工智能、虚拟现实与可视化国际学术会议(AIVRV 2022)
  18. C/C++编程:虚函数与纯虚函数
  19. 微博相互关注互粉mysql表实现_数据库设计实现用户关注、被关注、互粉
  20. 倒计时3天!第二届数字孪生城市建设与产业发展高峰论坛不见不散

热门文章

  1. win cmd php中文乱码
  2. 快速消费品企业TPM-营销费用管控系统应用实例
  3. 第10章 对文件的输入输出
  4. css3 动画的实现
  5. 堪培拉地理位置经纬度_全球各大城市的经纬度?,全球各大著名城市的经纬度...
  6. mysql5.532,又双叒叕一篇评测,StorageReview这样评价PBlaze5 916 U.2 NVMe SSD
  7. 20230402英语学习
  8. 陀螺产业区块链第三季 | 基于区块链的重庆市电子处方流转平台
  9. Three.js开发:环境贴图效果
  10. Android实现计时器功能