binder源码分析(一)
2020-04-01 18:51
316 查看
前言
接触Android的时候就对binder有所耳闻,作为进程间通信的工具,binder驱动,拷贝数据的次数少,也不是太复杂,前段时间看来了些源码,自己尝试分析了之后还是受益匪浅,写下来,日后也可以看看回顾一下。
这里也是servicemanager开始,串一遍注册和获取服务的过程,分析一下binder的源码。
servicemanager
- 首先是servicemanager的注册,值得注意的是,servicemanager不是java程序,是用C跑的。
int main(int argc, char** argv) { struct binder_state *bs; union selinux_callback cb; char *driver; if (argc > 1) { driver = argv[1]; } else { driver = "/dev/binder"; } bs = binder_open(driver, 128*1024); //建立起内存映射等 if (binder_become_context_manager(bs)) { ALOGE("cannot become context manager (%s)\n", strerror(errno)); return -1; } ...(selinux相关) binder_loop(bs, svcmgr_handler); return 0; }
- binder_become_context_manager()中进行ioctl(),cmd为BINDER_SET_CONTEXT_MGR,ioctl调用binder_ioctl_set_ctx_mgr(),新建binder_node并赋值给context->binder_context_mgr_node(service_manager的节点)
- binder_loop()先调用ioctl(),cmd为BC_ENTER_LOOPER,将当前线程(service_manager)thread->looper设置为BINDER_LOOPER_STATE_ENTERED。接着开始调用binder_ioctl读取binder中的消息,注意这里write_size为0,read_size非0,进入binder_thread_read后因为当前没有任务会阻塞。
void binder_loop(struct binder_state *bs, binder_handler func) { int res; struct binder_write_read bwr; uint32_t readbuf[32]; bwr.write_size = 0; bwr.write_consumed = 0; bwr.write_buffer = 0; readbuf[0] = BC_ENTER_LOOPER; binder_write(bs, readbuf, sizeof(uint32_t)); for (;;) { bwr.read_size = sizeof(readbuf); bwr.read_consumed = 0; bwr.read_buffer = (uintptr_t) readbuf; res = ioctl(bs->fd, BINDER_WRITE_READ, &bwr); ... // log res = binder_parse(bs, 0, (uintptr_t) readbuf, bwr.read_consumed, func); if (res == 0) { ALOGE("binder_loop: unexpected reply?!\n"); break; } ... } }
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- Android源码分析-Alarm机制与Binder的交互
- Android源码分析-Alarm机制与Binder的交互
- Android Binder跨进程与非跨进程的传输异同源码分析
- Asp.net MVC源码分析--获取ModelBinder的优先级
- Binder源码分析之驱动层(原)
- Android IPC之Binder源码分析
- 插件开发之360 DroidPlugin源码分析(三)Binder代理
- Asp.net MVC源码分析 -- 获取ModelBinder的优先级
- 插件开发之360 DroidPlugin源码分析(三)Binder代理
- android播放器(music player)源码分析1-Service,Binder,ServiceConnection
- Android 源码分析 -- (二) Binder机制
- Binder源码分析之Native层
- Binder源码分析之驱动层
- Android应用程序启动Binder线程源码分析
- Binder源码分析之ServiceManager(原)
- android系统源码分析——binder架构图
- Binder源码分析之ServiceManager
- Binder源码分析之驱动层(原)
- asp.net mvc源码分析-DefaultModelBinder 自定义的普通数据类型的绑定和验证
- android系统源码分析——binder基础数据结构