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进行通过通信
借一张偷来的图
网友评论