《Linux设备驱动开发详解》之udev用户空间设备管理

一 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内核

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值