免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6147 | 回复: 13
打印 上一主题 下一主题

Linux内核检测USB事件 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-02-21 20:29 |只看该作者 |倒序浏览
大家好,我要在Linux内核层中实现以下功能:当有U盘插入时,能检测到这一动作,并对U盘进行验证,只有通过验证的U盘才允许使用。比如只有U盘的某个特定扇区是自己定义的内容时才允许使用。

请问,有什么好的思路吗?

论坛徽章:
0
2 [报告]
发表于 2012-02-21 21:16 |只看该作者
如果你能找到u盘的唯一标识的话,可以用个散列算法比如md5(当然不要告诉别人),然后固定存在u盘的某个区域。比如mbr后面有32KB的最后部分。

不过唯一标识应该没有那么好找的吧,除非自己定制u盘。

论坛徽章:
0
3 [报告]
发表于 2012-02-21 21:47 |只看该作者
回复 2# blake326

多谢blake兄。不过我现在遇到的困难是:不知道应该怎样在内核层检测U盘插入事件。

当一个USB设备插入系统后,usb host会检测到这一事件,然后向CPU发送中断请求,并获取该usb设备的信息。usb core会根据usb id来匹配调用一个合适的usb driver处理该usb设备。

那么,我应该在内核的哪一层来检测U盘的插入事件呢?

1. 是应该修改内核文件drivers/usb/storage/usb.c文件吗?但是这样做需要重新编译内核,不实用。

2. 自己写一个usb driver,来专门处理自己需要验证的一类U盘?

请大家多多指点。
   

论坛徽章:
0
4 [报告]
发表于 2012-02-23 19:57 |只看该作者
gfengict 发表于 2012-02-21 21:47
回复 2# blake326

多谢blake兄。不过我现在遇到的困难是:不知道应该怎样在内核层检测U盘插入事件。


有现实的接口,udev可以捕获它。

论坛徽章:
0
5 [报告]
发表于 2012-02-24 09:47 |只看该作者
回复 4# 独孤九贱


请问现实的接口具体是什么?   

论坛徽章:
0
6 [报告]
发表于 2012-02-24 10:35 |只看该作者
udevd就是一个应用程序,你直接使用它就可以满足你的需求了,如果你非要自己的实现,那就下载它的源代码吧。

论坛徽章:
0
7 [报告]
发表于 2012-02-24 15:29 |只看该作者
内核新驱动模型对这种热插拔提供了很好的支持,除去udev这些,你自己还有更大的自主权去控制这种热插拔事件,虽然本意并非给自己的书做广告,但是这种对U盘插入的检测在《深入Linux设备驱动内核机制》第9章有个具体的例子,通过kobject/kset的特性自己实现了一个捕捉热插拔事件的程序:

“本例展示了在Linux设备模型最底层kobject一级的sysfs文件系统的作用以及对设备热插拔机制的支持,虽然内核已经通过更高层次的bus、device与driver这些对象向程序员屏蔽了sysfs和uevent底层的这些操作,但是我们应该知道bus、device与driver这一层面的诸如属性文件相关操作以及对设备热插拔特性的支持,其幕后的原理其实就发源于此。
这段文字临结束时,我又突发奇想,不妨插个U盾到机器里来看看会发生什么,于是/var/log/messages中就有了下面的输出:
  1. Jun 19 04:11:45 AMDLinuxFGL kernel: [ 5803.856011] usb 3-1: new full speed USB device number 3 using uhci_hcd
  2. Jun 19 04:11:46 AMDLinuxFGL hotplug: ----------------------------------------
  3. Jun 19 04:11:46 AMDLinuxFGL hotplug: argv[1]=usb
  4. Jun 19 04:11:46 AMDLinuxFGL hotplug: env=ACTION=add
  5. Jun 19 04:11:46 AMDLinuxFGL hotplug: env=DEVPATH=/devices/pci0000:00/0000:00:1a.0/usb3/3-1
  6. Jun 19 04:11:46 AMDLinuxFGL hotplug: env=SUBSYSTEM=usb
  7. Jun 19 04:11:46 AMDLinuxFGL hotplug: env=MAJOR=189
  8. Jun 19 04:11:46 AMDLinuxFGL hotplug: env=MINOR=258
  9. Jun 19 04:11:46 AMDLinuxFGL hotplug: env=DEVNAME=bus/usb/003/003
  10. Jun 19 04:11:46 AMDLinuxFGL hotplug: env=DEVTYPE=usb_device
  11. Jun 19 04:11:46 AMDLinuxFGL hotplug: env=PRODUCT=8e6/1813/100
  12. Jun 19 04:11:46 AMDLinuxFGL hotplug: env=TYPE=0/0/0
  13. Jun 19 04:11:46 AMDLinuxFGL hotplug: env=BUSNUM=003
  14. Jun 19 04:11:46 AMDLinuxFGL hotplug: env=DEVNUM=003
  15. Jun 19 04:11:46 AMDLinuxFGL hotplug: env=SEQNUM=1470
  16. Jun 19 04:11:46 AMDLinuxFGL hotplug: env=HOME=/
  17. Jun 19 04:11:46 AMDLinuxFGL hotplug: env=PATH=/sbin:/bin:/usr/sbin:/usr/bin
  18. Jun 19 04:11:46 AMDLinuxFGL hotplug: ----------------------------------------
  19. ...
复制代码
一旦你检测到这种热插拔事件,下面做什么还不是你说了算

论坛徽章:
0
8 [报告]
发表于 2012-02-24 16:05 |只看该作者
回复 7# MagicBoy2010

可以共享一份您推荐的书籍的电子版吗?

论坛徽章:
0
9 [报告]
发表于 2012-02-27 21:08 |只看该作者
全部的电子版目前尚未出来,请耐心等待。。。

论坛徽章:
0
10 [报告]
发表于 2012-07-12 16:59 |只看该作者
哥们,你的问题解决了没?可以发份代码给我参考学习下否?谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP