这几天在做一个项目的过程中遇到了如下问题:运行在Linux内核的驱动程序需要主动向udev发出删除设备的请求,这个问题也就是内核通过何种措施向驻留在用户态的udev进程发送事件,通知udev进程去删除设备?
为了搞清楚这个问题,对Linux设备管理进行了分析,最后终于找到了解决问题的办法。首先我们来分析一下,当Linux内核释放一个块设备的时候做了哪些操作?他是采用何种机制通知udev去删除/dev目录下的设备文件节点?
当用户层发送删除一个块设备时,通常通过IOCTL将删除的消息传递给内核驱动,驱动程序会释放内存资源,并且调用del_gendisk()函数删除设备。在del_gendisk函数中会执行unlink_gendisk()-->blk_unregister_queue ()函数,该函数会通过kobject_uevent发送REMOVE事件。REMOVE事件通过netlink接口向驻留在用户层的udevd和unplugd进程传递过去,就这样内核的事件通过netlink机制就传输给了用户进程。udev用户进程接收到事件之后,会根据udev的规则文件调用具体的执行脚本,执行脚本完成该事件的具体方法。这一过程可以通过下图进行描述:
理清上述思路之后,就可以很容易的在内核往udev发送事件,从而让udev完成内核所要求的任务。实现这样的操作具体需要做如下步骤:
1、 修改udev的规则文件,规则文件位于/etc/udev/rules.d目录。具体规则文件的内容可以google一把。
2、 实现执行脚本,即事件所对应的执行脚本。
3、在内核通过kobject_uevent向udevd发送事件,事件类型可以为:ADD、REMOVE、UPDATE、OFFLINE、ONLINE以及UMOUNT。
阅读(3931) | 评论(0) | 转发(0) |