目录
1.2.2 关注➕handle_device_event 和handle_firmware_event的分析:
本章关键点总结 & 说明:
说明:思维导图是基于之前文章不断迭代的,本章内容我们关注➕uevent & watchdog部分即可
1 Uevent入口
Uevent是接收uevent的守护进程,这里它的主要作用根据kernel接收到的uevent事件来创建或删除/dev/xxx(xxx设备名),主函数实现如下:
int ueventd_main(int argc, char **argv)
{
struct pollfd ufd;
int nr;
char tmp[32];
umask(000);
signal(SIGCHLD, SIG_IGN);
open_devnull_stdio();//输入输出重定向
klog_init();
#if LOG_UEVENTS
/* Ensure we're at a logging level that will show the events */
if (klog_get_level() < KLOG_INFO_LEVEL) {
klog_set_level(KLOG_INFO_LEVEL);
}
#endif
//selinux相同,同init
union selinux_callback cb;
cb.func_log = log_callback;
selinux_set_callback(SELINUX_CB_LOG, cb);
INFO("starting ueventd\n");
//----1 解析和处理ueventd的rc文件,start
import_kernel_cmdline(0, import_kernel_nv);
get_hardware_name(hardware, &revision);
ueventd_parse_config_file("/ueventd.rc");//<关键点1,解析配置文件>
snprintf(tmp, sizeof(tmp), "/ueventd.%s.rc", hardware);//ueventd.rk30board.rc
ueventd_parse_config_file(tmp);
//----1 解析和处理ueventd的rc文件,end
//----2 polling uevent消息,对设备进行管理,start
device_init();//设备初始化
ufd.events = POLLIN;
ufd.fd = get_device_fd();//获取由device_init中uevent_open_socket打开的device_fd
while(1) {
ufd.revents = 0;
nr = poll(&ufd, 1, -1);//poll监听ufd
if (nr <= 0)
continue;
if (ufd.revents & POLLIN) // polling到消息,处理event消息
handle_device_fd();
}
//----2 polling uevent消息,对设备进行管理,end
}
1.1 解析和处理uevent的rc文件
解析流程参考后面的init.rc的解析流程,流程如下:
/**
ueventd_parse_config_file
{根据rc文件,生成一个参考数据结构图}
->parse_config
-->loop循环
-->int token = next_token(&state);
-->根据token执行parse_line
--->lookup_keyword,查找关键字
--->分支kw_is(kw, SECTION)
---->parse_new_section(state, kw, nargs, args);
----->根据kw获取不同的parse_line,这里设置为parse_line_subsystem或no_op{空操作}
------>parse_line_subsystem中调用lookup_keyword();->根据kw 获取s->devname_src和s->dirname
--->分支kw_is(kw, OPTION)
---->state->parse_line(state, nargs, args);
--->分支,其他,即表示根据rc文件创建数据结构,为后期创建节点做数据参考图
---->parse_line_device(state, nargs, args);->set_device_permission()
----->获取(name, attr, perm, uid, gid, prefix, wildcard)参数
----->add_dev_perms(name, attr, perm, uid, gid, prefix, wildcard);
*/
注意:ueventd_parse_config_file