【筆記】 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的請求

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