启动ServerManager
文件路径:
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相关推荐
- openedge-hub模块启动源码浅析——百度BIE边缘侧openedge项目源码阅读(1)
前言 因为最近项目需要用到边缘计算,结合百度的openedge进行开发,openedge目前主要功能为结合docker容器实现边缘计算,具体内容官网很多,其架构中,openedge-hub作为所有模块 ...
- 在Windows环境下部署SVN服务器
一.下载SVN的服务端 Downloads | VisualSVN 二.下载SVN的客户端 Downloads · TortoiseSVN 同时下载语言包 三.SVN服务端的安装及配置 设置服务器目录 ...
- SuperSocket 服务管理器 (ServerManager)
SuperSocket SuperSocket 服务管理器 (ServerManager) 中文(中国)Toggle Dropdown 关键字: ServerManager, 服务管理器, 管理, 管 ...
- Zygote和System进程的启动过程
##init脚本的启动 +------------+ +-------+ +-----------+ |Linux Kernel+--> |init.rc+-> |app_process| ...
- c++builder启动了怎么停止_App 竟然是这样跑起来的 —— Android App/Activity 启动流程分析...
在我的上一篇文章: AJie:按下电源键后竟然发生了这一幕 -- Android 系统启动流程分析zhuanlan.zhihu.com 我们分析了系统在开机以后的一系列行为,其中最后一阶段 AMS( ...
- Hbase RegionServer 启动失败 Time difference of xxx ms max allowed of 30000ms
Hbase RegionServer 启动报错 异常如下: STOPPED: Unhandled: org.apache.hadoop.hbase.ClockOutOfSyncException: S ...
- windchill文件无法上传服务器,Windchill MethodServer无法启动
MethodServer.log : com.infoengine.exception.adapter.IEAdapterException; nested exception is: 星期二 3/6 ...
- weblogic 启动常见错误解决
1 weblogic启动常见错误及解决方法 1) weblogic无法启动,不能访问http://localhost:7001/console a) 先查看weblogic的控制端口是否7001,不是 ...
- mysql 错误193 0xc1_启动网维大师服务时提示“错误193: 0xc1”
[问题现象] 启动网维大师服务时提示错误193: 0xc1,报错截图如下: [原因说明] 服务的启动路径中带有空格,并且服务调用程序(ServerManager.exe)的存放路径中包含不规则的文件夹 ...
最新文章
- 【OpenCV 4开发详解】轮廓发现与绘制
- 美工程序员—每个创业公司都在寻找的传奇人物
- 从Proxy到Vue3数据绑定
- Matplotlib Tutorial(译)
- 用户管理界面开源代码_某教师培训信息管理系统渗透思路分享
- 关于海量分页的补充说明(转)
- 比较标签 php,比较标签 · ThinkPHP5.0完全开发手册 · 看云
- [Android实例] 有关spinner 的item问题 谁能给解答下??
- IPv6下VRRP配置原理及实例
- 取色器ColorPix
- 性能工具之stress工具使用教程(带源码说明)
- 缩放指数型线性单元(SELU)
- 关于New Date()获取的不是当前电脑时间问题
- Method annotated with @Bean is called directly. Use dependency injection instead.
- Win10 - 卸载自带应用
- 计算机维修主板电容谷包维修,计算机主板维修之电容篇
- 好书推荐--Linux之父Linus的自传《Just for Fun》
- Crypto++库实现AES和RSA加密解密
- 软件企业测试人员的角色与职责
- [面试]机器学习面试常见问题
热门文章
- 打开 计算机 找不到桌面图标,电脑启动后桌面图标不见了怎么办 不显示图标解决办法...
- 记录两段经典标定代码
- log nginx 客户端请求大小_后端实践:Nginx日志配置(超详细)
- WPF: RenderTransform特效
- Map集合遍历的四种方式理解和简单使用
- LINUX inner-process communication
- sql insert and update
- ORACLE 配置文件
- 提高 ASP.NET Web 应用性能的 24 种方法和技巧
- [转]arm汇编相关链接