1.Service Manager组件是用来管理Server并且向Client提供查询Server远程接口的功能;
2.Service Manger、Client和Server三者分别是运行在独立的进程当中,这样它们之间的通信也属于进程间通信:也是采用Binder机制,所以Service Manager也在充当Server的角色,然而,它是一种特殊的Server。
ServiceManager:
1.main函数在“frameworks/base/cmds/servicemanager/service_manager.c”
service_manager::main()
1.binder.c :: binder_open (128*1024) : 建立128K内存映射
(1) (binder_state ) bs->fd = open("/dev/binder", O_RDWR) : 通过文件操作函数open来打开/dev/binder设备文件
1.1 : 创建一个struct binder_proc (threads、nodes、 refs_by_desc和refs_by_node)来保存打开设备文件“/dev/binder”的进程上下文,
(2)binder.c ::binder_mmap () : 对打开的设备文件进行内存映射操作,建立128K内存映射:
1.1 进程虚拟地址空间和内核虚拟地址空间来映射同一个物理页面 : Binder的精髓,同一个物理页面,一方映射到进 程虚拟地址空间,一方面映射到内核虚拟地址空间,这样,进程和内核之间就可以减少一次内存拷贝了,提到了进程间通信效率:
(一般的做法是,Client将这块数据从它的进程空间拷贝到内核空间中,然后内核再将这个数据从内核空间拷贝到Server的进程空间,这样,Server就可以访问这个数据了。但是在这种方法中,执行了两次内存拷贝操作,而采用我们上面提到的方法,只需要把Client进程空间的数据拷贝一次到内核空间,然后Server与内核共享这个数据就可以了,整个过程只需要执行一次内存拷贝,提高了效率)
2.binder.c :: binder_become_context_manager() :通知Binder驱动程序自己是Binder机制的上下文管理者,即守护进程
3.调用binder.c :: binder_loop () 函数进入循环,等待Client来请求
1.一是打开Binder设备文件;
2.告诉Binder驱动程序自己是Binder上下文管理者,即我们前面所说的守护进程;
3.一个无穷循环,充当Server的角色,等待Client的请求