1 udev完全在用户态工作
2 udev利用设备加入或移除时内核所发送的热插拔事件来工作,在热插拔时,设备的详细信息会由内核通过netlink套接字(uevent)发送给用户空间,然后根据事先定义的udev规则,创建对应的设备文件节点。
3 udev对冷插拔的处理:向uevent节点写“add”,触发内核重新发送netlink,之后udev就可以收到对应的uevent事件,再之后的过程同热插拔处理过程。
- #include
-
- 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;
- }
1)当内核检测到系统中出现了新设备后,内核会通过netlink套接字发送uevent
2)udev获取到内核发送的信息,进行规则匹配
ACTION:行动
KERNEL:内核设备名
BUS:总线类型
SUBSYSTEM:子系统名
ATTR:属性
NAME:创建的设备文件节点名
SYMLINK:符号创建链接名
OWNER:设备的所有者
GROUP:设备所属组
IMPORT:调用的外部程序
MODE:节点访问权限
在匹配部分,可以通过*, ?, [a - z], [1 - 9]等shell通配符来匹配多个设备
嵌入式:mdev,位于busybox中
Android:vold
参考文档:《Linux设备驱动程序开发详解》基于最新的Linux 4.0内核