cold plug创建节点过程(uevent)

uevent 和 ueventd 在init进程中负责创建dev节点。
一般在linux系统中提供mknod等方式创建dev节点,但Android由于安全等原因没有提供创建节点的方式。
取而代之的是在 ueventd 进程中通过如下两种方式创建dev node。
1. hot plug: 系统中通过ueventd动态生成dev node
2. cold plug: 根据已经定义好的信息在init进程中创建dev node

之所以有cold plug方式,是因为动态创建需要ueventd进程启动,所以在ueventd进程之前需要生成的dev node没有办法创建。
cold plug方式是在ueventd启动之前,读取ueventd.rc和uevent.%hardware%.rc文件并在ueventd进程中创建dev node。

代码如下:首先是在init进程中启动ueventd,这会调用函数ueventd_main

int ueventd_main(int argc, char **argv)
{
    struct pollfd ufd;
    int nr;
    char tmp[32];

        /* Prevent fire-and-forget children from becoming zombies. * If we should need to wait() for some children in the future * (as opposed to none right now), double-forking here instead * of ignoring SIGCHLD may be the better solution. */
    signal(SIGCHLD, SIG_IGN);

    open_devnull_stdio();
    klog_init();

    INFO(“starting ueventd\n”);

    /* Respect hardware passed in through the kernel cmd line. Here we will look * for androidboot.hardware param in kernel cmdline, and save its value in * hardware[]. */
    import_kernel_cmdline(0, import_kernel_nv);

    get_hardware_name(hardware, &revision);

    ueventd_parse_config_file(“/ueventd.rc”);

    snprintf(tmp, sizeof(tmp), “/ueventd.%s.rc”, hardware);
    ueventd_parse_config_file(tmp);

    device_init();

    ufd.events = POLLIN;
    ufd.fd = get_device_fd();

    while(1) {
        ufd.revents = 0;
        nr = poll(&ufd, 1, -1);
        if (nr <= 0)
            continue;
        if (ufd.revents == POLLIN)
               handle_device_fd();
    }
}

这里比较重要的函数是ueventd_parse_config和device_init函数。

ueventd_parse_config_file函数读取ueventd.rc和ueventd..rc文件。

ueventd.rc 和 ueventd.%hardware%.rc 文件里边保存device名字,permission,gid,uid等信息。
没有保存的device permission和gid,uid的默认是600,0,0。

device_init函数会打开uevent_socket并执行coldboot函数。这里打开的uevent_socket是用来接受后面发生的uevent用的。

你可能感兴趣的:(uevent)