快速业务通道

把脉Linux上USB数据流

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-05-10

笔者曾得到一个类似于加密“狗”的USB设备,要使之在Linux下正常工作.然而,通过一个名为USBView的小程序判断,Linux内核无 法驱动这个USB设备,并且在“Linux USB Working Devices”的列表中也没有找到该设备,这意味着只有很少的人在使用这种类型的 USB设备.

在Linux的/proc/bus/usb/devices文件中,有这个USB设备的一些信息:

T: Bus=01 Lev=02 Prnt=03 Port=02 Cnt=01 Dev#=4 Spd=1.5 MxCh=0
D: Ver=1.00 Cls=ff(vend.) Sub=00 Prot=ff MxPS=8 #Cfgs=1
P: Vendor=0d7a ProdID=0001 Rev=1.07
S: Manufacturer=Marx
S: Product=USB crypToken
C: * #Ifs=1 Cfg#=1 Atr=80 MxPwr=16mA
I: If#=0 Alt=0 #EPs=0 Cls=ff(vend.) Sub=00 Prot=ff Driver=(none)

通过查阅该USB设备产品光盘上提供的文档,可以简单了解这个USB设备的用途.产品光盘上还提供了一个共享库,应用程序可以通过共享库使用这个USB设备.此外,产品光盘还提供了一个小的测试程序来展示不同的库方法是如何工作的.通过这个共享库,使 用者可以采用libusb方式直接访问该设备.也就是说,使用这个USB设备并不需要一个内核级的驱动.但是,这个共享库的授权协 议不允许一个遵循GPL协议的程序来使用它.只有以上这些信息是无法把这个USB设备驱动起来的,下面就从追溯Linux上的USB数据流开始,给大家提供一种解决此类问题的思路.

解决方案

可以从最新的2.6版本的内核入手,解决此问题.2.6版本的内核可以通过很多种渠道得到,这里不做详述.

在内核源代码的结构树中的drivers/usb/core/目录下,有inode.c、devices.c和devio.c三个文件,这三个文件共同实现了usbfs 文件系统.也就是说,Linux是通过这三个文件访问USB设备的.实现文件系统的主要工作由inode.c完成,它提供多种VFS代码,用 这些代码可以创建虚拟文件系统或虚拟文件.devices.c文件用于创建和读取/proc/bus/usb/devices下表示USB设备状态信息的文 件.devio.c文件用于控制通过usbfs文件系统对USB设备的访问.要想使Linux能够访问USB设备,需要对devices.c和devio.c做些修改.

Empire CMS,phome.net

具体实现

1.记录访问信息

探索USB数据流从记录所有的USB设备访问信息开始.在用户程序中,通过usbfs访问USB设备需要在相应的设备文件上调用ioctl()

命令.通过进一步分析devices.c文件,发现每次执行ioctl()时都会调用usbdev_ioctl()函数,因此,在这里记录发送给USB设备的访问信息应该是一个很好的解决方法.通过在每一个case语句中加入一个自定义的printk()函数,可以实现此功能,基本内容如 下:


case USBDEVFS_CLAIMINTERFACE:
printk("CLAIMINTERFACE");
ret = proc_claiminterface(ps, (void __user *)arg);
break;
case USBDEVFS_RELEASEINTERFACE:
printk("RELEASEINTERFACE");
ret = proc_releaseinterface(ps, (void __user *)arg);
break;

经过编译、安装等过程后,每个usbfs访问都被记录在内核日志当中,通过dmesg命令可以访问这些日志记录.

2.记录控制信息

通过分析/proc/bus/usb/devices文件中对USB设备的描述,可以得知要最终解决问题关心这些访问的控制终点(Control Endp oint).devio.c文件中的proc_control()函数是用来处理控制消息的.该函数通过如下语句区分请求访问的类型是读控制消息, 还是写控制消息:

if (ctrl.bRequestType & 0x80)

bRequestType是一个二进制变量,其最高位决定请求的类型.

在处理读消息的代码段中加入如下代码,用以记录控制请求的信息:

printk("control read: "
"bRequest=x bRrequestType=x "
"wValue=x wIndex=x",
ctrl.bRequest, ctrl.bRequestType,
ctrl.wValue, ctrl.wIndex);

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号