美文网首页
servicemanager启动和获取

servicemanager启动和获取

作者: nich | 来源:发表于2021-12-14 18:02 被阅读0次

    servicemanager主要是管理系统的service

    1.service_manager启动

    主要步骤分为 

    1.bs = binder_open(128*1024);(打开驱动并内存映射一下)

    2.if (binder_become_context_manager(bs)) 成为大管理

    3.binder_loop(bs, svcmgr_handler);循环

    下面看详细代码

    init.rc启动servicemanage

    接下来再service_manager_c里面的main方法启动

    启动 binder_open

    接下来看binder_become_context_manager方法

    调用binder的ioctl方法

    最后走到这里主要看binder_new_node方法

    设置 SM 为大管理 --- sm  作用  为了管理系统服务,1.创建 binder_node 结构体对象2.proc --》 binder_node3.创建  work  和 todo --》类似 messageQueue

    接下来看binder_loop方法

    首先BC_ENTER_LOOPER 命令,写入状态Loop

    binder_write(bs, readbuf, sizeof(uint32_t)); // 设置线程的 looper状态为循环状态

    res = ioctl(bs->fd, BINDER_WRITE_READ, &bwr); 不断地 binder读数据,没有数据会进入休眠状态

    ioctl里面方法通过传入BINDER_WRITE_READ最后看到方法binder_thread_write的这里

    去读数据:binder_thread_read:ret = wait_event_freezable_exclusive(proc->wait, binder_has_proc_work(proc, thread)); 进入等待

    2.获取servicemanager

    主要看这三个方法

    1.ProcessState::self()方法点击进去主要看ProcessState

    open_driver打开驱动,设置线程最大数目:15个,mmap  -- 设置共享内存大小 --- (1M-8K) 普通服务的大小

    2getContextObject

    可以看出它主要是创建一个客户端对象bpbinder

    3.interface_cast

    他是通过模版方法定义的,最后我们找到

    mRemote指向 new BpBinder(0),从而 BpServiceManager能够利用 Binder进行通过通信

    借一张偷来的图

    相关文章

      网友评论

          本文标题:servicemanager启动和获取

          本文链接:https://www.haomeiwen.com/subject/fqqyfrtx.html