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);
}
本文详细解析了Android系统中ServiceManager的启动流程,包括init.rc配置、service_manager.c中的main方法实现,以及Binder机制在ServiceManager初始化过程中的作用。
1485

被折叠的 条评论
为什么被折叠?



