udev 实现

来源:互联网 发布:兵器推演软件 编辑:程序博客网 时间:2024/05/22 12:50

2011-5-1

Udev

udevLinux2.6以来提供的设备管理机制,负责对/dev目录下的所有设备文件进行管理,包括初始化阶段和事件触发阶段。

1、初始化阶段:建立“/sys”目录下指定子目录中规定的设备文件并可能执行处理脚本

2、事件触发阶段:响应设备管理的UEVENT事件,包括设备插入和拔出事件。响应如下:

a)在设备插入时建立设备文件,并可能执行处理脚本

b)在设备删除时删除设备文件,并可能执行处理脚本

 

1.  dev

系统初始化时,udev会搜索“/sys”目录来建立一系列设备文件。

/sys”目录中,udev会搜索blockclass两个子目录下面的各级子目录,直到找到一个名称为“dev”文件为止。

此时,udev会在“/dev”下建立一个设备文件,文件名称为“dev”文件所在目录名称,主设备号和从设备号存放在“dev”文件中。搜索“/sys/block”目录时,建立的都是块设备文件;搜索“/sys/class”建立的都是字符设备文件。

建立设备文件时,udev会搜索“mdev.config”中的设备文件列表,确定建立的设备文件的一些属性,并可能执行处理脚本。

2. uevent

在系统运行过程中,可能会发生设备插入、拔出这样的事件,这通常发生在:

(a)  一些热插拔设备的插入拔出

(b)  内核模块载入和卸载引起的设备插入和拔出

在这些情况下,Linux内核会向用户空间发生UEVENT事件,调用的函数是

int kobject_uevent(struct kobject *kobj, enum kobject_action action)uevent事件包括下面这些参数(格式为“参数名称=参数值”):

1、ACTION”:表明当前动作,“add,remove,”change”,”move”,”online”,”offline”

2、DEVPATH”:设备路径,路径位于“/sys”下。

3、MAJOR”:主设备号

4、MINOR”:从设备号

 

而在应用程序中,通过监听NETLINK_KOBJECT_UEVENT这个专用于内核空间与用户空间uevent事件通信的socket通道,能够接受设备管理的uevent事件。

收到后,udev会建立或删除“/dev”目录下对应设备文件,其中主设备号和从设备号来源于UEVENT事件的参数“MAJOR”和“MINOR”;字符设备或块设备则根据参数“DEVPATH”位于“block”还是“class”子目录下;设备文件名称则来自参数“DEVPATH”对应路径的最后一个节点名称。设备文件属性则来源于“mdev.conf

如果配置文件中规定了该设备插入、拔出时的处理脚本,则在产生插入、拔出事件后,udev除了建立、删除设备文件外,还会执行对应的处理脚本

       代码流程的细节可以看下图

 

   

3.       mdev.conf

文件“/etc/mdev.conf”是udev的配置文件,它存放着一个设备文件列表,列出了建立该设备文件时需要设置的属性和处理的脚本。在该列表中,每行对应一个设备文件。

一个行用空格分成了多个域,包括:

设备名称  用户ID:ID 文件权限 =路径 >路径 @|$|*处理脚本

各域说明如下:

1、设备名称:POSIX风格正则表达式格式,由udev搜索匹配的设备文件名。

2、用户ID:ID:表明该设备文件对应的用户和组

3、文件权限:Linux38进制数权限,即所有者权限、同组用户权限和其他用户权限

4、=路径:可选域,相当于执行命令“mv 设备文件名称 路径”

5、>路径:可选域,相当于执行命令“cp 设备文件名称 路径”

6、@|$|*处理脚本:可选域。包含处理脚本解析UEVENT事件类型,并进行相关处理。这三个字符不同在于

(1)@处理脚本:建立设备文件后执行处理脚本

(2)$处理脚本:删除设备文件前执行处理脚本

(3)*处理脚本:建立设备文件后或删除设备文件前都执行该脚本。这种脚本很可能要解析UEVENT事件来区分是建立还是删除

 

这样,初始化时,或产生设备管理的UEVENT事件时,udev会搜索该配置文件的设备文件列表的每一行,将产生事件的设备名称与该行中设备名称域进行匹配,如果匹配,则按照该行中的描述进行处理。处理包括:

(1)建立或删除设备文件:如果是建立设备文件,则按该行中的用户和权限设置设备文件。

(2)执行该行中包含的处理脚本

 

比如:event[0-9]      0:0     666     >input/

则在event0event9任何一个设备插入时,建立设备文件/dev/eventX(X=0~9)/dev/input/eventX

 

 

 

 

 

原创粉丝点击