Binder机制原理学习笔记(4)_ServiceManager启动Binder分析

本文详细介绍了Android系统中ServiceManager如何启动Binder进程。从`binder_open`、`binder_become_context_manager`到`binder_loop`,解析了每个步骤的主要功能,包括设置Binder驱动文件路径、打开驱动、注册ServiceManager为Context Manager以及开始Binder循环。通过mmap映射内存,确保与内核空间的数据交互,并阐述了128KB映射大小的原因。

ServiceManager启动Binder

Framwork源码解析(1)_Zygote进程启动流程一文中了解过,Android系统启动Zygote进程然后创建SystemService,再创建其他服务进程,ServiceManager 进程也是在这里启动的。查看/system/core/rootdir/init.rc源码,可以找到启动servicemanager:
在这里插入图片描述
这里启动的是/frameworks/native/cmds/servicemanager下的service_manager.c文件,此目录下还有servicemanager.rc配置,就是被zygote启动的。
查看service_manager.c源码的main方法:

int main(int argc, char** argv){
   
   
	// ......
    if (argc > 1) {
   
   
        driver = argv[1];
    } else {
   
   
    	// 设置默认binder驱动文件路径
        driver = "/dev/binder";
    }
	// 打开binder文件,并设置映射文件大小为128KB
    bs = binder_open(driver, 128*1024);
    // 成为上下文管理者
    if (binder_become_context_manager(bs)) {
   
   
        ALOGE("cannot become context manager (%s)\n", strerror(errno));
        return -1;
    }
	// ......
	// 开启binder循环
    binder_loop(bs, svcmgr_handler);
    return 0;
}

主要做了三件事:

  • 设置默认binder驱动文件路径,root过的手机可以在/dev/binder目录下找到Binder驱动文件
  • 打开binder驱动:binder_open
  • 将ServiceManager注册成为 binder 服务管理者:binder_become_context_manager
  • 开启binder循环:binder_loop

binder_open

找到同级目录下的frameworks/native/cmds/servicemanager/binder.c文件,该文件中找到binder_open方法:

struct binder_state *binder_open(const char* driver, size_t mapsize)
{
   
   
    struct binder_state *bs;
    struct binder_version vers;
    
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ruiurrui

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值