service_manager 的注册与获取

本文详细解析了Android系统中ServiceManager的启动流程,包括init.rc配置、service_manager.c中的main方法实现,以及Binder机制在ServiceManager初始化过程中的作用。

servicemanager

service_manager 是native层的,它的Hander是为0的。它也是一个服务。

下面是下init.rc中启动入口servicemanager :

service servicemanager /system/bin/servicemanager
    class core
    user system
    group system
    critical
    onrestart restart healthd
    onrestart restart zygote
    onrestart restart media
    onrestart restart surfaceflinger
    onrestart restart drm

这样会直接调用service_manager.c文件中的main方法:

int main(int argc, char **argv)
{
       bs = binder_open(128*1024); // 这个不是直接打开驱动的方法;
       if (binder_become_context_manager(bs)) {}
        binder_loop(bs, svcmgr_handler);
}

上面的binder_open(128*1024)方法解析:

 struct binder_state *binder_open(size_t mapsize)
{
   bs->fd = open("/dev/binder", O_RDWR); //打开binder驱动
   bs->mapped = mmap(NULL, mapsize, PROT_READ, MAP_PRIVATE, bs->fd, 0); //进行内存地址的映射
   
}

binder_become_context_manager(bs) 这个将函数是将ServiceManager设置为大管家:

int binder_become_context_manager(struct binder_state *bs)
{
         return ioctl(bs->fd, BINDER_SET_CONTEXT_MGR, 0);
}

上面的 ioctl 方法就会调用是:

static long binder_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
{
case BINDER_SET_CONTEXT_MGR:
  ret = binder_ioctl_set_ctx_mgr(filp);
}
// 创建SM的实体
static int binder_ioctl_set_ctx_mgr(struct file *filp)
{
// SM的实体对象:
context->binder_context_mgr_node = binder_new_node(proc, 0, 0);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值