【笔记】 Binder

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的请求

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章