3.android 开机启动流程分析--init启动中关键进程 uevent & watchdog

目录

本章关键点总结 & 说明:

1 Uevent入口

1.1  解析和处理uevent的rc文件

1.2 polling uevent消息,对设备进行管理

1.2.1 device_init()实现如下:

1.2.2 关注➕handle_device_event 和handle_firmware_event的分析:

1.3 总结{uevent功能}

2  watchdog分支分析

2.1 watchdog逻辑说明:

2.2 watchdog进程的主函数实现如下:


本章关键点总结 & 说明:

说明:思维导图是基于之前文章不断迭代的,本章内容我们关注➕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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值