打印
[嵌入式linux]

linux下usb的相关实验. 学习. 讲解.(3-16更新)

[复制链接]
5118|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sinanjj|  楼主 | 2010-3-15 13:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 sinanjj 于 2010-3-16 16:03 编辑

usb sniffer -- usbmon
usb臭探器 ---usbmon

usbmon is a Linux kernel module that can be used to capture USB traffic.
usbmon是一个可以被用于捕捉/臭探/监视usb通讯的内核模块。
                 enable usbmon 使能usbmon
#mount -t debugfs none_debugs /sys/kernel/debug
#modprobe usbmon
照着这个去做就是了。 那么 为什么是这两个命令?好吧。 解释下:
第一行指令加载debugfs
第二行指令加载usbmon模块(或者确认已经加载。默认好像就加载。)
就是usbmon这个模块运用了debugfs这个用于内核同用户层交互信息的通道来同用户程序交互信息。参见
http://www.mjmwired.net/kernel/Documentation/filesystems/debugfs.txt
Debugfs exists as a simple way for kernel developers to make information available to user space.  Unlike /proc, which is only meant for information about a process, or sysfs, which has strict one-value-per-file rules, debugfs has no rules at all.  Developers can put any information they want there.
总之, 对我们而言就是在rootshell下输入这俩命令就是了。

        find the USB devices attached to your system
         查看链接到你系统的usb设备
使用lsusb命令
$lsusb
Bus 008 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 007 Device 002: ID 1267:0201 Logic3 / SpectraVideo plc A4Tech SWOP-3 Mouse
...
对结果进行解释前。我们得了解下linux下的usb模型。和usb的一点基础知识。
+-----------------------------------+
|            linux box              |
| |Bus 001| |Bus 002| |Bus 003| ... |
+-----------------------------------+
    | \_____
    |(usb)  \_____
    |             \
+------------+ +------------+
| Device 001 | | Device 002 | ...
+------------+ +------------+
如下图:

那么, linux下每一个独立的usb硬件设备都叫一个usb bus。那么为什么是bus呢?这个要从usb的硬件结构说起。。。(又要插播一大段)
一个usb的硬件结构就是一可向上挂设备的bus(不知道别的bus??那想像2根线,一收一发。设备都能联到上边。恩)在这个bus上,usb规定了协议来支持热插拔。并规定了金字塔装的结构。
usb协议规定。一个usb系统只能有一个usb host。就是说。usb这个bus上只有一个主控器。那么一个独立的usb系统肯定是有个独立的主控器的。 然后这个独立的主控器挂在到linux box内部, 在linux内部,这个设备就被称为 usb bus N,就是lsusb显示的bus N。(可以通过 $lspci |grep usb 查看挂在pci总线的usb控制器。)
好bus N我们知道是一个独立的usb系统了。接下来就是device N的解释了。这个需要usb 标准的一点知识了。
usb总线上挂载的设备都交device, 当然有个标号,所以device N。那么,root hub是怎么回事?就是这个总线还可以接usb总线。。。。。恩一个金字塔结构。上图吧。


实际上硬件上是个总线结构。usb hub是总线控制器,挂在总线上的。

那么,usb控制器有一个root hub(为什么?规定的。。。),这个root hub也是作为一个设备出现的。当然,一号设备。
你可以使用 $ lsusb -t 这个命令来看usb的tree结构。
lsusb输出的id表示usb设备的id。这个id由芯片制造商设置。唯一表示该设备。idVendor:idProduct 前4位代表厂商。后4位代表产品。
注意到root hub的id都是相同的???


        Capturing USB traffic
选定了我们要监听的usb设备后。我们就开始臭探usb数据。
直接使用一下指令:
#cat /sys/kernel/debug/usbmon/<usb bus number>u
<usb bus number>这个替换成你要监听的usb bus number。以我这个usb鼠标为例:
查到usb鼠标挂载在bus 007上那么这个命令就是:
#cat /sys/kernel/debug/usbmon/7u

我的usb鼠标得到一下类似输出:
f6e85640 140013725 C Ii:7:002:1 0:8 4 = 01000000
f6e85640 140013749 S Ii:7:002:1 -115:8 4 <
f6e85640 140101727 C Ii:7:002:1 0:8 4 = 00000000
f6e85640 140101756 S Ii:7:002:1 -115:8 4 <
。。。

我们来分析这些输出。
The format of the usbmon output is one line for each piece of data sent or received by the device. The record separator is the space character. All information exchanged between the host (PC) and the device is contained into an structure called an URB (USB request block)
每行的输出代表一个usb数据包。linux内部用URB结构来描述usb数据包。每行的输出基本上反应了URB的情况。

URB结构:
<address of the URB structure> <time stamp> <Transfer type> <Address specification> <URB specific data>
套用此结构分析上包。
f6e85640 140013725 C Ii:7:002:1 0:8 4 = 01000000

那么,f6e85640是URB的地址。
140013725是时间戳。
C是Transfer type (什么意思后面讲。)
Ii:7:002:1是Address specification(什么意思见后)
0:8 4 = 01000000 是URB specific data。

接下来我们看看URB结构每一个段表示什么。

<address of the URB structure> 很显然,就是URB在内核内存的地址。
<time stamp> 表示时间的。以UTC时间为基准。(1970年1月1日开始的秒数)
<Transfer type> 传输类型???一眼看不出来。好解释下:
<Transfer type>: S(from the host/linux), C(from the device), E(Error)
就是 Transfer type可以是S,C,E,S代表这usb包从usbhost,就是linux系统来。C代表这个包从usb设备来。E代表这个包不明。
我习惯把S当成server, C当成Client。server当然是usb主控,client当然是usb设备啦。
E型数据包还没见过。。。哪位见到了可以提交上来。
我们再看看<Address specification>。
<Address specification>: <kind of transfer>:<Bus number>:<device address>:<endpoint number>

懂USB协议的朋友一看就知道了。
<kind of transfer>: USB standard allows for "Control", "Block", "Isochronous", "Interrupt" or "Block" URBs. The first letter denotes the type of transfer and the second its direction. Z(Isochronous). Direction: i - input, o - output.
就是usb协议规定了5种数据包。分别是:"Control", "Block", "Isochronous", "Interrupt" or "Block"。然后这个<kind of transfer>是包种类和方向放在一起构成的。
<Bus number>:<device address>这个不解示。上边写了。
<endpoint number>这个usb协议里规定的。到了device address这里后已经可以精确到一个设备了。但是一个设备可能需要多个数据通道,这个endpoint就是数据通道号。类似TCP协议里的端口。
剩下是<URB specific data>,我们现不管它。
那么接下来,我们应该做几个好玩的试验,

相关帖子

沙发
scalertu| | 2012-6-9 12:04 | 只看该作者
附件呢?

使用特权

评论回复
板凳
dong_abc| | 2012-6-9 13:17 | 只看该作者
好玩的试验,快来呀 ?

使用特权

评论回复
地板
macrosh| | 2012-11-6 14:56 | 只看该作者
thanks.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:In God We Trust 独立的个人,体赖科学技术工具提供针对个人的产品与服务,是通向幸福的唯一道路 工程师,设计师等可以个人创业的群体,将逐步瓦解官僚体制公司,成为中国中产。(重复劳动,工厂等,将逐步机械化) seacer.co

456

主题

6300

帖子

25

粉丝