Chinaunix首页 | 论坛 | 博客
  • 博客访问: 169720
  • 博文数量: 22
  • 博客积分: 1632
  • 博客等级: 上尉
  • 技术积分: 490
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-01 14:28
文章分类

全部博文(22)

文章存档

2010年(10)

2009年(3)

2008年(9)

分类: LINUX

2010-04-07 15:36:36

 

    这几天在做一个项目的过程中遇到了如下问题:运行在Linux内核的驱动程序需要主动向udev发出删除设备的请求,这个问题也就是内核通过何种措施向驻留在用户态的udev进程发送事件,通知udev进程去删除设备?

        为了搞清楚这个问题,对Linux设备管理进行了分析,最后终于找到了解决问题的办法。首先我们来分析一下,当Linux内核释放一个块设备的时候做了哪些操作?他是采用何种机制通知udev去删除/dev目录下的设备文件节点?

        当用户层发送删除一个块设备时,通常通过IOCTL将删除的消息传递给内核驱动,驱动程序会释放内存资源,并且调用del_gendisk()函数删除设备。在del_gendisk函数中会执行unlink_gendisk()-->blk_unregister_queue ()函数,该函数会通过kobject_uevent发送REMOVE事件。REMOVE事件通过netlink接口向驻留在用户层的udevdunplugd进程传递过去,就这样内核的事件通过netlink机制就传输给了用户进程。udev用户进程接收到事件之后,会根据udev的规则文件调用具体的执行脚本,执行脚本完成该事件的具体方法。这一过程可以通过下图进行描述:

    理清上述思路之后,就可以很容易的在内核往udev发送事件,从而让udev完成内核所要求的任务。实现这样的操作具体需要做如下步骤:

1、 修改udev的规则文件,规则文件位于/etc/udev/rules.d目录。具体规则文件的内容可以google一把。

2、 实现执行脚本,即事件所对应的执行脚本。

3、在内核通过kobject_ueventudevd发送事件,事件类型可以为:ADDREMOVEUPDATEOFFLINEONLINE以及UMOUNT

阅读(3931) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~