把脉Linux上USB数据流
笔者曾得到一个类似于加密“狗”的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做些修改。
具体实现
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] [3] 下一页
- 最新评论