Android系統Binder機制學習總結

來源:互聯網
上載者:User

標籤:

一、Binder機制概述

在Android開發中,很多時候我們需要用到處理序間通訊,所謂處理序間通訊,實現處理序間通訊的機制有很多種,比如說socket、pipe等,Android中處理序間通訊的方式主要有三種:

1.標準Linux Kernel IPC 介面;

2.標準D-BUS介面;

3.Binder介面。

其中,Binder機制是使用最且最被認可的,因為Binder機制有以下優點:

1.相對於其它IPC機制,Binder機制更加簡潔和快速;

2.消耗的記憶體相對更少;

3.傳統的IPC機制可能會增加進程的開銷,以及出現進程過載和安全性漏洞,Binder機制則有效避免和解決了這些問題。

Binder機制是Android系統的核心機制,幾乎貫穿於整個Android系統,Android系統基本上可以看作是一個基於binder通訊機制的C/S架構,Binder就像網路,把Android系統的各個部分串連到了一起。利用Binder機制,可以實現以下功能:

1.用驅動程式來推進處理序間通訊;

2.通過共用記憶體來提高效能;

3.為進程請求分配每個進程的線程池;

4.針對系統中的對象引入了引用計數和跨進程的對象引用映射;

5.進程間同步調用。

二、Binder機制的工作流程

1.用戶端擷取服務端的帶來對象(proxy)。我們需要明確的是用戶端進程並不能直接操作服務端中的方法,如果要操作服務端中的方法,那麼有一個可行的解決方案就是在用戶端建立一個服務端進程的代理對象,這個代理對象具備和服務端進程一樣的功能,要訪問服務端進程中的某個方法,只需要訪問代理對象中對應的方法即可;

2.用戶端通過調用代理對象向服務端發送請求。

3.代理對象將使用者請求通過Binder驅動發送到伺服器處理序;

4.服務端進程處理用戶端發過來的請求,處理完之後通過Binder驅動返回處理結果給用戶端的服務端代理對象;

5.代理對象將請求結果進一步返回給用戶端進程。

通過以上5個步驟,就完成了一次Binder通訊。

三、Binder機制的組成

Binder機制由三部分組成,即:

1.Client;

2.Server;

3.ServiceManager。

三部分組件之間的關係:

1.Client、Server、ServiceManager均在使用者空間中實現,而Binder驅動程式則是在核心空間中實現的;

2.在Binder通訊中,Server進程先註冊一些Service到ServiceManager中,ServiceManager負責管理這些Service並向Client提供相關的介面;

3.Client進程要和某一個具體的Service通訊,必須先從ServiceManager中擷取該Service的相關資訊,Client根據得到的Service資訊與Service所在的Server進程建立通訊,之後Clent就可以與Service進行互動了;

4.Binder驅動程式提供裝置檔案/dev/binder與使用者空間進行互動,Client、Server和ServiceManager通過open和ioctl檔案操作函數與Binder驅動程式進行通訊;

5.Client、Server、ServiceManager三者之間的互動都是基於Binder通訊的,所以通過任意兩者這件的關係,都可以解釋Binder的機制。

四、Binder驅動的實現簡介。

1.Binder採用了AIDL來描述進程間的介面;

2.Binder是一個特殊的字元型裝置,裝置節點為dev/binder。

3.Binder驅動程式由以下兩個檔案實現:

  ①kernel/drivers/staging/binder.h

  ②kernel/drivers/staging/binder.c

4.在Binder驅動的實現過程中,以下函數起著關鍵作用:

  ①使用binder_ioctl()函數與使用者空間交換資料;

  ②BINDER_WRITE_READ用來讀寫資料,資料包中的cmd域用於區分不同的請求;

  ③使用binder_thread_write()函數來發送請求或返回結果,在binder_thread_write()函數中,通過調用binder_transaction()函數來轉寄請求並返回結果.當收到請求時,binder_transaction()函數會通過對象的handle找到對象所在的進程,如果handle結果為空白,則認為此對象是context_mgr,然後把請求發給context_mgr所在的進程,並將請求中所有的Binder對象放到RB樹中,最後把請求放到目標進程的隊列中以等待目標進程的讀取。;

  ④使用binder_thread_read()函數來讀取結果;

  ⑤在函數binder_parse()中實現資料解析工作。  

五、Binder驅動程式中的資料結構

1.binder_work。binder_work表示在binder驅動中進程要處理的工作項目。

2.binder_node。binder_node用於定義Binder實體物件。Android系統中每一個Srevice組件在Binder驅動程式中都對應一個Binder實體物件。驅動中的Binder實體也叫做“節點”,你屬於提供實體的進程;

3.binder_ref。binder_ref用於描述一個Binder引用對象。Android系統中每一個Client組件在Binder驅動程式中都對應一個Binder引用對象;

4.binder_ref_death。binder_ref_death是一個通知結構體。只要某進程訂閱了某binder引用對應實體的死亡通知,那麼binder驅動就會為該binder引用建立一個binder_ref_death通知結構體,將其儲存在當前進程的對應binder引用結構體的death域中,即Binder引用對象將死亡通知註冊到Binder驅動程式中。這裡涉及到Binder的死亡通知機制,Binder的死亡通知機制具體指:如果Binder實體物件意外死亡,那麼將會導致改Binder實體物件的引用變得無效,因而就需要在Binder實體物件死亡的時候通知到所有引用它的代理對象,從而在一定程度上預防和解決Binder飲用對象無效的問題;

5.binder_buffer。Binder_Buffer用於描述一個核心緩衝區,能夠在進程之間傳輸資料;

6.binder_proc。binder_proc表示正在使用Binder進程通訊機制的進程,能夠儲存調用Binder的各個進程或線程的資訊,如線程ID、進程ID、Binder狀態資訊等;

7.binder_thread。binder_thread用於儲存每一個單獨的線程的資訊,表示Binder線程池中的一個線程;

8.binder_transaction。binder_transaction用於中轉請求和返回結果,並儲存接收和要發送的進程資訊;

9.binder_write_read。binder_write_read表示在進程之間的通訊過程中傳輸的資料,資料包中有一個cmd域用於區分不同的請求;

10.BinderDriverCommandProtocol。結構體binder_write_read包含的命令在BinderDriverCommandProtocol中定義;

11.BinderDriverReturnProtocol。BinderDriverReturnProtocol中定義了讀操作命令協議;

12.binder_ptr_cookie。binder_ptr_cookie表示一個Binder實體物件或Service組件的死亡接收通知;

13.binder_transaction_data。binder_transaction_data表示在通訊過程中傳遞的資料;

14.flat_binder_object。flat_binder_object表示Binder對象。Android系統中,在進程之間傳遞的資料稱為Binder對象。

六、Binder的詳細實現。

1.裝置初始化。Binder機制的裝置初始化函數binder_init位於inder.c中,在進行裝置初始化的時候binder_init會調用裝置驅動介面函數device_initcall;

2.開啟裝置檔案。Binder機制,函數binder_open用於開啟Binder裝置檔案/dev/binder。Android系統中,驅動程式的任何一個進程及線程都可以開啟一個Binder裝置;與binder_open函數功能相反的是binder_release函數,用於釋放開啟的空間以及操作過程中分配的空間;

3.實現記憶體映射。當開啟Binder裝置檔案/dev/binder之後,需要調用函數mmap()把裝置記憶體映射到使用者進程地址空間中,這樣就可以像操作使用者記憶體那樣操作裝置記憶體。在Binder裝置中,對記憶體的映射操作是有限制的,如Binder不能映射具有寫入權限的記憶體地區,最大能映射4MB的記憶體地區等;

4.釋放物理頁面。Binder機制中,函數binder_insert_free_buffer()用於將進程中的Buffer插入進程資訊中,即將一個空閑核心緩衝區加入進程中的空閑核心緩衝區的紅/黑樹狀結構中;

5.處理核心緩衝區:

  ①*binder_alloc_buf()用於分配核心緩衝區;

  ②binder_insert_allocated_buffer()用於將分配的核心緩衝區添加到目標進程的已指派物理頁面的核心緩衝區紅/黑樹狀結構中;

  ③binder_free_buf()用於釋放核心緩衝區的操作;

  ④*buffer_start_page()和*buffer_end_page()用於計算結構體binder_buffer所佔用的虛擬頁面的地址;

  ⑤binder_delete_free_buffer()用於刪除結構體binder_buffer;

  ⑥*binder_buffer_lookup()根據一個使用者空間地址查詢一個核心緩衝區。

七、Binder封裝庫

 Android源碼中,各個層次都有Binder的相關實現,其中主要由本地原生代碼實現,其它層次的Binder實現都是調用原生Binder庫來實現的。

Binder的各層次實現為:

1.Binder驅動部分。實現功能如下:

  ①組織Binder的服務及誒到哪;

  ②調用Binder相關的處理線程;

  ③完成實際的Binder傳輸。

2.Binder Adapter層。Binder Adapter層是對Binder驅動的封裝,主要功能是操作Binder驅動,因而應用程式無須直接和Binder驅動程式關聯。關聯檔案包括IPCThreadState.cpp、ProcessState.cpp和Parcel.cpp中的一些內容。Binder核心庫是Binder架構的核心實現,主要包括IBinder、Binder(服務端)和BpBinder(用戶端)。

3.頂層。頂層binder架構和具體的用戶端。

三層結構

 

Android系統Binder機制學習總結

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.