Binder(二)

启动service_manager
1.启动servicemanager进程
2.main
2-1.binder_open
2-2.binder_become_context_manager
2-2-1.binder_ioctl
2-2-2.binder_ioctl_set_ctx_mgr
2-2-2-1.binder_new_node
2-3.binder_loop
2-3-1.binder_write
2-3-2.binder_thread_write
2-3-3.binder_thread_read
获取service_manager
1.defaultServiceManager
1-1.ProcessState::self
1-1-1.ProcessState::ProcessState
1-1-1-1.open_driver
1-2.ProcessState::getContextObject
1-2-1.ProcessState::getStrongProxyForHandle
1-2-2.BpBinder::BpBinder
1-3.interface_cast
1-3-1.IServiceManager::asInterface
1-3-2.DECLARE_META_INTERFACE
1-3-3.IMPLEMENT_META_INTERFACE
1-4.BpServiceManager
1-4-1.BpInterface::BpInterface
1-4-2.BpRefBase
启动service_manager
1.启动servicemanager进程
ServiceManager是由init进程通过解析init.rc文件而创建的,其所对应的可执行程序servicemanager
所对应的源文件是service_manager.c 进程名为servicemanager
2.main
启动ServiceManager的入口函数是 service_manager.c 中的main()方法。
 
frameworks/native/cmds/servicemanager/service_manager.c // 354 int main(int argc, char **argv) // 358 打开 binder驱动,申请 128k字节大小的内存空间---见后面小节 bs = binder_open(128*1024); // 364 设为守护进程,成为 binder大管理者---见后面小节 if (binder_become_context_manager(bs)) { // 391 进入无限循环,处理client端发来的请求---见后面小节 binder_loop(bs, svcmgr_handler);
2-1.binder_open
frameworks/native/cmds/servicemanager/binder.c // 96 struct binder_state *binder_open(size_t mapsize) // 98 这个结构体记录了 service_manager 中有关于 binder 的所有信息 struct binder_state *bs; // 107 打开 binder驱动,得到文件描述符 bs->fd = open("/dev/binder", O_RDWR); // 123 bs->mapsize = mapsize; // service_manager自己设置的,大小为 128kb /*通过系统调用,mmap内存映射,mmap必须是 page的整数倍(即 4kb的整数倍)*/ bs->mapped = mmap(NULL, mapsize, PROT_READ, MAP_PRIVATE, bs->fd, 0);
2-2.binder_become_context_manager
2-2-1.binder_ioctl
kernel/drivers/staging/android/binder.c
//3241
staticlongbinder_ioctl(structfile*filp,unsignedintcmd,unsignedlongarg)//3277
caseBINDER_SET_CONTEXT_MGR:
ret=binder_ioctl_set_ctx_mgr(filp);
2-2-2.binder_ioctl_set_ctx_mgr
kernel/drivers/staging/android/binder.c
//3200
staticintbinder_ioctl_set_ctx_mgr(structfile*filp)
//3208保证只创建一次mgr_node对象,不为null就直接返回if(context->binder_context_mgr_node){
//3216
/*uid是否有效,当前是无效的*/
if(uid_valid(context->binder_context_mgr_uid)){
}else{
/*设置当前线程euid作为service_manager的uid*/context->binder_context_mgr_uid=curr_euid;
}
//创建service_manager实体
context->binder_context_mgr_node=binder_new_node(proc,0,0);
//3233将binder_context_mgr_node的强弱引用各加1
context->binder_context_mgr_node->local_weak_refs++;
context->binder_context_mgr_node->local_strong_refs++;context->binder_context_mgr_node->has_strong_ref=1;
context->binder_context_mgr_node->has_weak_ref=1;
2-2-2-1.binder_new_node
2-3.binder_loop
2-3-1.binder_write
2-3-2.binder_thread_write
2-3-3.binder_thread_read
获取service_manager
获取Service Manager是通过defaultServiceManager()方法来完成。
 
1.defaultServiceManager
1-1.ProcessState::self
 
1-1-1.ProcessState::ProcessState
1-1-1-1.open_driver
1-2.ProcessState::getContextObject
1-2-1.ProcessState::getStrongProxyForHandle
1-2-2.BpBinder::BpBinder
1-3.interface_cast
1-3-1.IServiceManager::asInterface
对于asInterface()函数,通过搜索代码,你会发现根本找不到这个方法是在哪里定义这个函数的, 其实是
通过模板函数来定义的。
1-3-2.DECLARE_META_INTERFACE
展开即可得:
该过程主要是声明asInterface(),getInterfaceDescriptor()方法。
1-3-3.IMPLEMENT_META_INTERFACE
展开即可得:
1-4.BpServiceManager
1-4-1.BpInterface::BpInterface
1-4-2.BpRefBase
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值