快速业务通道

把脉Linux上USB数据流

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

然后,再加入如下代码,用来记录从设备中读出的实际数据:

printk("control read: data ");
for (j = 0; j < ctrl.wLength; j)
printk("x ", ctrl.data[j]);
printk("");
Empire CMS,phome.net

同样,可以在处理写消息的代码段中加入类似的代码.这样以来,生成并重新装载新的usbcore模块后,就可以记录对设备的所有 双向控制消息了.这些消息可能会返回如下信息:

CONTROL
control read: bRequest=06 bRrequestType=80 wValue=0300 wIndex=0000
control read: data 00 00 61 63

3.优化

接下来要对修改代码做些优化,以使内核源代码很好地接受这些修改.,应该修正在printk()调用中的一些不正确的地方.其次,所有的printk()调用都应该有一个相应的日志级别(LoggingLevel),这些日志级别可以通过预处理的方式生成.将include /linux/kernel.h文件修改如下:

#define KERN_EMERG "<0>" /* system is unusable */
#define KERN_ALERT "<1>" /* action must be taken immediately */
#define KERN_CRIT "<2>" /* critical conditions */
#define KERN_ERR "<3>" /* error conditions */
#define KERN_WARNING "<4>" /* warning conditions */
#define KERN_NOTICE "<5>" /* normal but significant condition */
#define KERN_INFO "<6>" /* informational */
#define KERN_DEBUG "<7>" /* debug-level messages */

以上修改完成后,将usbfs_ioctl()函数中的printk()调用从“printk("CLAIMINTERFACE");”修改为“printk(KERN_INFO "CLAIMINTE RFACE);”.

实际上,并不是所有的消息都需要记录到日志中.可以采用头文件include/linux/device.h中所提供的宏(包括dev_printk()、de v_dbg()、dev_warn()、dev_info()和dev_err())来决定何种类型的USB设备访问消息需要被记录.这些宏都需要一个附加指针指 向一个结构类型,以此标识惟一的设备ID.将dev_info()调用修改如下:

dev_info(&dev->dev, "CLAIMINTERFACE");
然后将确定读、写消息请求的printk()调用修改如下:
Empire CMS,phome.net

dev_info(&dev->dev, "control read: "
"bRequest=x bRrequestType=x "
"wValue=x wIndex=x",
ctrl.bRequest, ctrl.bRequestType,
ctrl.wValue, ctrl.wIndex);
dev_info(&dev->dev, "control read: data ");
for (j = 0; j < ctrl.wLength; j)
printk("x ", ctrl.data[j]);
printk("");

经过上述修改,得到如下返回信息:

usb 1-1: CONTROL
usb 1-1: control read: bRequest=06 bRrequestType=80 wValue=0300 wIndex=0000
usb 1-1: control read: data 00 00 61 63

不难看出,经过上述修改,清除掉了无关的USB设备的消息记录信息.

上述过程会产生一个易用性上的问题,即消息记录信息并不是在用户请求时刻产生的,这样会导致用户的消息记录过于庞大.在de vio.c文件中加入下面的代码行可以解决这一问题:

static int usbfs_snoop = 0;
module_param (usbfs_snoop, bool, S_IRUGO | S_IWUSR);
MODULE_Parm_DESC (usbfs_snoop, "true to log all usbfs traffic");

上述代码定义了一个新的module_param()函数,用来代替原来的MODULE_Parm()函数.两者之间的主要区别在于module_param()中含有一个新的参数“usbfs_snoop”.可以运行modinfo命令查看修改后的效果:

$ modinfo usbcore
license: GPL
parm: blinkenlights:true to cycle leds on hubs
parm: usbfs_snoop:true to log all usbfs traffic

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

上一页123下一页
分享到: 更多
你可能对下面的文章感兴趣
上一篇: Ubuntu 8.10 更新源整下一篇: 安装Ubuntu 尝试Linux的电脑崩溃

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号