servicemanager主要是管理系统的service
1.service_manager启动
主要步骤分为
1.bs = binder_open(128*1024);(打开驱动并内存映射一下)
2.if (binder_become_context_manager(bs)) 成为大管理
3.binder_loop(bs, svcmgr_handler);循环
下面看详细代码
![](https://img.haomeiwen.com/i6909627/52df7334318ea904.png)
接下来再service_manager_c里面的main方法启动
![](https://img.haomeiwen.com/i6909627/59712b3fb0f446af.png)
![](https://img.haomeiwen.com/i6909627/1166b9e124c9ed11.png)
接下来看binder_become_context_manager方法
![](https://img.haomeiwen.com/i6909627/62291b449dcacc5b.png)
调用binder的ioctl方法
![](https://img.haomeiwen.com/i6909627/20682e409cc46ae7.png)
最后走到这里主要看binder_new_node方法
![](https://img.haomeiwen.com/i6909627/dde515f0054e1030.png)
设置 SM 为大管理 --- sm 作用 为了管理系统服务,1.创建 binder_node 结构体对象2.proc --》 binder_node3.创建 work 和 todo --》类似 messageQueue
接下来看binder_loop方法
![](https://img.haomeiwen.com/i6909627/1b81622519fe568a.png)
首先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的这里
![](https://img.haomeiwen.com/i6909627/0e3327271334ad31.png)
去读数据:binder_thread_read:ret = wait_event_freezable_exclusive(proc->wait, binder_has_proc_work(proc, thread)); 进入等待
2.获取servicemanager
![](https://img.haomeiwen.com/i6909627/4f653c12cd1f1878.png)
主要看这三个方法
1.ProcessState::self()方法点击进去主要看ProcessState
![](https://img.haomeiwen.com/i6909627/0477900beef22364.png)
open_driver打开驱动,设置线程最大数目:15个,mmap -- 设置共享内存大小 --- (1M-8K) 普通服务的大小
2getContextObject
![](https://img.haomeiwen.com/i6909627/f44fbb9cc725f96d.png)
可以看出它主要是创建一个客户端对象bpbinder
3.interface_cast
![](https://img.haomeiwen.com/i6909627/858b671a2b462077.png)
他是通过模版方法定义的,最后我们找到
![](https://img.haomeiwen.com/i6909627/d9d192d47790672c.png)
mRemote指向 new BpBinder(0),从而 BpServiceManager能够利用 Binder进行通过通信
借一张偷来的图
![](https://img.haomeiwen.com/i6909627/908d6880965fa374.png)
网友评论