servicemanager启动和获取

2021-12-14  本文已影响0人  nich

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进行通过通信

借一张偷来的图

上一篇下一篇

猜你喜欢

热点阅读