这篇文章记录下 ServiceManager的注册
1.注册,ServiceManager.c中的main方法
首先看binder_open方法 这里首先binder_open会调用驱动层的binder_open方法,打开binder驱动,保存当前进程一些信息.然后会调用mmap也是会调用驱动层的binder_mmap方法,映射一块共享内存,大小为128k 这里会调用驱动层的binder_ioctl方法,命令为BINDER_SET_CONTEXT_MGR 然后binder_new_node 这里就设置SM为大管家完成,再回到main方法,看看binder_loop方法 然后binder_write方法,readbuf携带命令BC_ENTER_LOOPER 这里又会调用驱动层binder_ioctl方法,有写数据不为空,命令为BINDER_WRITE_READ 因为写数据不为空,则会调用write方法,且前面携带了命令头为BC_ENTER_LOOPER,则 到这里就完了,然后在回到前面loop方法中 写完数据后,然后进入for循环,此时读有数据,继续调用驱动层读写方法 进入读方法 这里因为还没有任务,所以为true 因为现在todo队列为空,则会调用wait_event_freezable_exclusive方法进行等待,到这里就完了ServiceManager的注册,大致干了3件事
1,打开binder驱动,内存映射
2,设置ServiceManager为大管家(守护进程)
3,写入数据,设置状态,然后开启循环,没有任务时等待.
网友评论