udev&uevent之一 -- udev

//@system/core/rootdir/init.rc
on early-init
    start ueventd
....

service ueventd /sbin/ueventd
    critical

//@system/core/init/ueventd.c
int ueventd_main(int argc, char **argv)
+-- get_hardware_name(hardware, &revision);
+-- ueventd_parse_config_file("/ueventd.rc");                   //解析ueventd.rc
+-- snprintf(tmp, sizeof(tmp), "/ueventd.%s.rc", hardware);     
+-- ueventd_parse_config_file(tmp);                             //解析ueventd.xxx.rc
+-- device_init();
    +-- device_fd = open_uevent_socket();
        +-- struct sockaddr_nl addr;
        +-- memset(&addr, 0, sizeof(addr));
        +-- addr.nl_family = AF_NETLINK;
        +-- addr.nl_pid = getpid();
        +-- addr.nl_groups = 0xffffffff;
        +-- s = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT);  //创建关联NETLINK_KOBJECT_UEVENT事件的socket
        +-- setsockopt(s, SOL_SOCKET, SO_RCVBUFFORCE, &sz, sizeof(sz));
        +-- setsockopt(s, SOL_SOCKET, SO_PASSCRED, &on, sizeof(on));
        +-- bind(s, (struct sockaddr *) &addr, sizeof(addr)
    +-- fcntl(device_fd, F_SETFD, FD_CLOEXEC);
    +-- fcntl(device_fd, F_SETFL, O_NONBLOCK);
    +-- if (stat(coldboot_done, &info) < 0) {
            t0 = get_usecs();
            coldboot("/sys/class");
            coldboot("/sys/block");
            coldboot("/sys/devices");
            t1 = get_usecs();
            fd = open(coldboot_done, O_WRONLY|O_CREAT, 0000);
            close(fd);
            log_event_print("coldboot %ld uS\n", ((long) (t1 - t0)));
        } else {
            log_event_print("skipping coldboot, already done\n");
        }

+-- ufd.events = POLLIN;
+-- ufd.fd = get_device_fd();
    +-- return device_fd;           //static int device_fd = -1;
+-- while(1) {
        ufd.revents = 0;
        nr = poll(&ufd, 1, -1);     //轮询NETLINK_KOBJECT_UEVENT事件
        if (nr <= 0)
            continue;
        if (ufd.revents == POLLIN)
               handle_device_fd();  //处理轮询到的NETLINK_KOBJECT_UEVENT事件
               /*
               +-- for(;;) {
                       char msg[UEVENT_MSG_LEN+2];
                       struct iovec iov = {msg, sizeof(msg)};
                       struct msghdr hdr = {&snl, sizeof(snl), &iov, 1, cred_msg, sizeof(cred_msg), 0};
                       ...
                       ssize_t n = recvmsg(device_fd, &hdr, 0); //接收到的msg应该就保存在iov定义的内存段中,即msg[]
                       struct uevent uevent;
                       parse_event(msg, &uevent);               //解析出msg中的uevent事件

                       handle_device_event(&uevent);            //处理添加/删除设备事件
                       handle_firmware_event(&uevent);          //处理加载/卸载firmware事件
                   }
                */
    }








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值