概述
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 ueventdn”);
/* 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用的。
最后
以上就是美丽帅哥为你收集整理的cold plug创建节点过程(uevent)的全部内容,希望文章能够帮你解决cold plug创建节点过程(uevent)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复