原创 Linux向udev发出设备事件的方法

2008-7-8 09:12 5727 9 9 分类: 软件与OS


    这几天在做一个项目的过程中遇到了如下问题:运行在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



文章评论0条评论)

登录后参与讨论
我要评论
0
9
关闭 站长推荐上一条 /2 下一条