啟動(dòng)ServiceManager流程
init.rc
service servicemanager /system/bin/servicemanager
啟動(dòng)service_manager.c
main()
binder_open(128*1024)//設(shè)置大小128k
binder_become_context_manager()
binder_loop()
binder_become_context_manager
設(shè)置SM為管家
ioctl(bs,BINDER_SET_CONTEXT_MGR)
binder_ioctl_set_ctx_mgr(struct file *flip)
//1.創(chuàng)建binder_node結(jié)構(gòu)體對(duì)象
//2.proc->binder_node
//3.創(chuàng)建work和todo隊(duì)列
binder_new_node(proc,0,0)
binder_loop()
循環(huán)監(jiān)聽(tīng)
//寫(xiě)入狀態(tài)loop
binder_write(bs,readbuf,sizeof(uint32_t))
ioctl(BINDER_WRITE_READ)
binder_ioctl_write_read()
binder_thread_write()
binder_thread_read()
//讀取數(shù)據(jù),進(jìn)入等待
for(;;){
ioctl(bs->fd,BINDER_WRITE_READ,&bwr)
binder_ioctl_write_read()
}
注冊(cè)服務(wù)到ServiceManager
IServiceManager.cpp
sp<IServiceManager> defaultServiceManager()
ProcessState::self()->getContextObject(NULL)
ProcessState::self()
open_driver()//打開(kāi)驅(qū)動(dòng)
ioctl(fd,BINDER_SET_MAX_THREADS,15)//設(shè)置最大線程數(shù)
mmap(1*1024*1024-2*4096)//設(shè)置內(nèi)存映射 普通服務(wù)大小1M-8k
getContextObject(NULL)
b = new BpBinder(handle)//客戶端的對(duì)象
interface_cast<IServiceManager>
asinterface
intr = new BpServiceManager(obj) //obj 就是BpBinder
remote.transact//遠(yuǎn)程調(diào)用 remote==BpBinder