一 udev特点
1 udev完全在用户态工作
2 udev利用设备加入或移除时内核所发送的热插拔事件来工作,在热插拔时,设备的详细信息会由内核通过netlink套接字(uevent)发送给用户空间,然后根据事先定义的udev规则,创建对应的设备文件节点。
3 udev对冷插拔的处理:向uevent节点写“add”,触发内核重新发送netlink,之后udev就可以收到对应的uevent事件,再之后的过程同热插拔处理过程。
二 udev简单实现
#include <linux/netlink.h>
int main(int argc, char *argv[])
{
struct sockaddr_nl nls;
struct pollfd pfd;
char buf[512];
memset(&nls, 0, sizeof(struct sockaddr_nl));
nls.nl_family = AF_NETLINK;
nls.nl_pid = getpid();
nls.nl_groups = -1;
pfd.events = POLLIN;
pfd.fd = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT);
if (pfd.fd == -1)
return -1;
if(bind(pfd.fd, (void *)&nls, sizeof(struct sockaddr_nl)))
return -1;
while(-1 != poll(&pfd, 1, -1)) {
int i;
int len = recv(pfd.fd, buf, sizeof(buf), MSG_DONTWAIT);
if (len == -1)
return -1;
i = 0;
while(i < len) {
printf("%s\n", buf + i);
i += strlen(buf + i) + 1;
}
}
return 0;
}
三 udev工作过程
1)当内核检测到系统中出现了新设备后,内核会通过netlink套接字发送uevent
2)udev获取到内核发送的信息,进行规则匹配
四 udev规则文件
1)匹配关键字
ACTION:行动
KERNEL:内核设备名
BUS:总线类型
SUBSYSTEM:子系统名
ATTR:属性
2)赋值关键字
NAME:创建的设备文件节点名
SYMLINK:符号创建链接名
OWNER:设备的所有者
GROUP:设备所属组
IMPORT:调用的外部程序
MODE:节点访问权限
3)udev规则写法
在匹配部分,可以通过*, ?, [a - z], [1 - 9]等shell通配符来匹配多个设备
五 udev变体
嵌入式:mdev,位于busybox中
Android:vold
参考文档:《Linux设备驱动程序开发详解》基于最新的Linux 4.0内核