文件路径:

server_manager.c:(.../frameworks//native/cmds/servicemanager/service_manager.c)
server_manager.c 单独使用的 binder.c(.../frameworks//native/cmds/servicemanager/binder.c)

入口函数是main()@server_manager.c

int main(int argc, char** argv){struct binder_state *bs;//打开 binder 驱动,申请128字节内存//对于 server_manager.c专门写了一个单独的 binder.c 供其使用bs = binder_open(128*1024);...if(binder_become_context_manager(bs)){...}...binder_loop(bs, svcmgr_handler);
}

server_manager的启动分为三步,第一步binder_open()打开 binder 驱动,第二步binder_become_context_manager()告知 Binder 驱动让自己称为管理者,第三步 binder_loop 进入循环与其他进程进行通信。

first:binder_open()

//.../frameworks//native/cmds/servicemanager/binder.c
struct binder_state *binder_open(size_t mapsize){...//打开 binder 驱动,调用到内核代码//binder_open@goldfish/drivers/staging/android/binder.cbs->fd = open("/dev/binder", O_RDWR);...//通过系统调用到binder_ioctl()@goldfish/drivers/staging/android/binder.c//与 binder 驱动进行通信,参数用 BINDER_VERSION获取 binder 版本信息//如果版本不一致会报错if((ioctl(bf->fd, BINDER_VERSION, &vers) == -1) || (...)){...}//通过系统调用到binder_mmap()@goldfish/drivers/staging/android/binder.c//进行内存映射bs->mmaped = mmap(NULL, mapsize, PROT_READ, MAP_PRIVATE, bs->fd, 0){...}
}
.../frameworks//native/cmds/servicemanager/binder.c
int binder_become_context_manager(struct binder_state *bs){//一样的系统调用到binder_ioctl(),传递参数BINDER_SET_CONTEXT_MGR//表明自己成为上下文管理者return ioctl(bs->fd, BINDER_SET_CONTEXT_MGR, 0);
}
//这里的 func 传递的是一个方法,表明处理消息的方法
//传递是是svcmgr_handler
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;//进入循环,不断得 binder 读写过程res = ioctl(bs->fd, BINDER_WRITE_READ, &bwr);if (res < 0) {ALOGE("binder_loop: ioctl failed (%s)\n", strerror(errno));break;}//解析 binder 信息,如果有需要进行 replyres = binder_parse(bs, 0, (uintptr_t) readbuf, bwr.read_consumed, func);if (res == 0) {ALOGE("binder_loop: unexpected reply?!\n");break;}if (res < 0) {ALOGE("binder_loop: io error %d %s\n", res, strerror(errno));break;}}
}int binder_parse(struct binder_state *bs, struct_io *bio,uintprt_t ptr, size_t size, binder_handler fun){...switch(cmd){case BR_NOOP:break;....case BR_TRANSACTION:...binder_send_reply(bs, &reply, txn->data.ptr.buffer, res);...}...
}

接下来看处理消息的函数

int scvmgr_handler(struct binder_state *bs, struct binder_transaction_data *txn,struct binder_io *msg,struct binder_ios *reply){...switch(txn->code){case SVC_MGR_GET_SERVICE:case SVC_MGR_CHECK_SERVICE:...handle = do_find_service(bs, s, len, txn_sender_euid, txn->sender_pid);...break;case SVC_MGR_LIST_SERVICES:...break;}
}

可以看到 service_manager 的主要功能是提供服务添加和服务查询功能;

总结下流程:

  • binder_open()

  • open("/dev/binder/) 打开 binder 驱动

  • ioctl(,BINDER_VERSION,)获得 binder 版本信息

  • mmap()进行内存映射

  • binder_become_context_manager()

  • binder_loop()进入 loop

  • ioctl()读写 binder

  • binder_parse()解析 binder 信息

  • svcmgr_handler()处理解析的信息

启动ServerManager相关推荐

  1. openedge-hub模块启动源码浅析——百度BIE边缘侧openedge项目源码阅读(1)

    前言 因为最近项目需要用到边缘计算,结合百度的openedge进行开发,openedge目前主要功能为结合docker容器实现边缘计算,具体内容官网很多,其架构中,openedge-hub作为所有模块 ...

  2. 在Windows环境下部署SVN服务器

    一.下载SVN的服务端 Downloads | VisualSVN 二.下载SVN的客户端 Downloads · TortoiseSVN 同时下载语言包 三.SVN服务端的安装及配置 设置服务器目录 ...

  3. SuperSocket 服务管理器 (ServerManager)

    SuperSocket SuperSocket 服务管理器 (ServerManager) 中文(中国)Toggle Dropdown 关键字: ServerManager, 服务管理器, 管理, 管 ...

  4. Zygote和System进程的启动过程

    ##init脚本的启动 +------------+ +-------+ +-----------+ |Linux Kernel+--> |init.rc+-> |app_process| ...

  5. c++builder启动了怎么停止_App 竟然是这样跑起来的 —— Android App/Activity 启动流程分析...

    在我的上一篇文章: AJie:按下电源键后竟然发生了这一幕 -- Android 系统启动流程分析​zhuanlan.zhihu.com 我们分析了系统在开机以后的一系列行为,其中最后一阶段 AMS( ...

  6. Hbase RegionServer 启动失败 Time difference of xxx ms max allowed of 30000ms

    Hbase RegionServer 启动报错 异常如下: STOPPED: Unhandled: org.apache.hadoop.hbase.ClockOutOfSyncException: S ...

  7. windchill文件无法上传服务器,Windchill MethodServer无法启动

    MethodServer.log : com.infoengine.exception.adapter.IEAdapterException; nested exception is: 星期二 3/6 ...

  8. weblogic 启动常见错误解决

    1 weblogic启动常见错误及解决方法 1) weblogic无法启动,不能访问http://localhost:7001/console a) 先查看weblogic的控制端口是否7001,不是 ...

  9. mysql 错误193 0xc1_启动网维大师服务时提示“错误193: 0xc1”

    [问题现象] 启动网维大师服务时提示错误193: 0xc1,报错截图如下: [原因说明] 服务的启动路径中带有空格,并且服务调用程序(ServerManager.exe)的存放路径中包含不规则的文件夹 ...

最新文章

  1. 【OpenCV 4开发详解】轮廓发现与绘制
  2. 美工程序员—每个创业公司都在寻找的传奇人物
  3. 从Proxy到Vue3数据绑定
  4. Matplotlib Tutorial(译)
  5. 用户管理界面开源代码_某教师培训信息管理系统渗透思路分享
  6. 关于海量分页的补充说明(转)
  7. 比较标签 php,比较标签 · ThinkPHP5.0完全开发手册 · 看云
  8. [Android实例] 有关spinner 的item问题 谁能给解答下??
  9. IPv6下VRRP配置原理及实例
  10. 取色器ColorPix
  11. 性能工具之stress工具使用教程(带源码说明)
  12. 缩放指数型线性单元(SELU)
  13. 关于New Date()获取的不是当前电脑时间问题
  14. Method annotated with @Bean is called directly. Use dependency injection instead.
  15. Win10 - 卸载自带应用
  16. 计算机维修主板电容谷包维修,计算机主板维修之电容篇
  17. 好书推荐--Linux之父Linus的自传《Just for Fun》
  18. Crypto++库实现AES和RSA加密解密
  19. 软件企业测试人员的角色与职责
  20. [面试]机器学习面试常见问题

热门文章

  1. 打开 计算机 找不到桌面图标,电脑启动后桌面图标不见了怎么办 不显示图标解决办法...
  2. 记录两段经典标定代码
  3. log nginx 客户端请求大小_后端实践:Nginx日志配置(超详细)
  4. WPF: RenderTransform特效
  5. Map集合遍历的四种方式理解和简单使用
  6. LINUX inner-process communication
  7. sql insert and update
  8. ORACLE 配置文件
  9. 提高 ASP.NET Web 应用性能的 24 种方法和技巧
  10. [转]arm汇编相关链接