然后,再加入如下代码,用来记录从设备中读出的实际数据:
printk("control read: data "); for (j = 0; j < ctrl.wLength; j) printk("x ", ctrl.data[j]); printk(""); |
同样,可以在处理写消息的代码段中加入类似的代码.这样以来,生成并重新装载新的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()调用修改如下:
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 |
|