【IT168技術】IT168移動頻道通過上一節Android的IPC機制-Binder的介紹,大家應該對Binder有了基本的認識了。任何上層應用程式接口和用戶操作都需要底層硬體設備驅動的支持,並為其提供各種操作接口。本節首先從Binder的驅動實現入手,分析其原理和它提供給用戶層使用的接口。
一、Binder驅動的原理
為了完成進程間通信,Binder採用了AIDL(Android Interface Definition Language)來描述進程間的接口。在實際的實現中,Binder是作為一個特殊的字符型設備而存在的,設備節點為/dev/binder,其實現遵循Linux設備驅動模型,實現代碼主要涉及以下文件:
kernel/drivers/staging/binder.h
kernel/drivers/staging/binder.c
在其驅動的實現過程中,主要通過binder_ioctl函數與用戶空間的進程交換數據。BINDER_WRITE_READ用來讀寫數據,數據包中有一個cmd域用於區分不同的請求。binder_thread_write函數用於發送請求或返回結果,而binder_thread_read函數則用於讀取結果。在binder_thread_write函數中調用binder_transaction函數來轉發請求並返回結果。當收到請求時,binder_transaction函數會通過對象的handle找到對象所在的進程,如果handle為空,就認為對象是context_mgr,把請求發給context_mgr所在的進程。請求中所有的Binder對象全部放到一個RB樹中,最後把請求放到目標進程的隊列中,等待目標進程讀取。數據的解析工作放在binder_parse()中實現;關於如何生成context_mgr,內核中提供了BINDER_SET_CONTEXT_ MGR命令來完成此項功能。下面我們就來看看Binder驅動究竟是如何實現的。
二、Binder驅動的實現
上面我們已經對Binder驅動的原理進行了分析,在開始分析驅動的實現之前,我們還是通過一個例子來說明Binder在實際應用中應該如何運用,以及它能幫我們解決什麼樣的問題。這樣會更容易幫助大家理解Binder驅動的實現。比如,A進程如果要使用B進程的服務,B進程首先要註冊此服務,A進程通過Binder獲取該服務的hanlde,通過這個handle,A進程就可以使用該服務了。此外,你可以把handle理解成地址。A進程使用B進程的服務還意味著二者遵循相同的協議,這個協議反映在代碼上就是二者要實現IBinder接口。
1.「對象」與「引用」
Binder不僅是Android系統中的一個完善的IPC機制,它也可以被當作Android系統的一種RPC(遠程過程調用)機制,因為Binder的功能就是在本地「執行」其他進程的功能。因此,進程在通過Binder獲取將要調用的進程服務時,可以是一個本地對象,也可以是一個遠程服務的「引用」。這一點可能比較難以理解,稍候就會為大家分析,這裡就先記住Binder不僅可以與本地進程通信,還可以與遠程進程通信;這裡的本地進程就是我們所說的本地對象,而遠程進程則是我們所說的遠程服務的一個「引用」 。[1]
Binder的實質就是要把對象從一個進程映射到另一個進程中,而不管這個對象是本地的還是遠程的。如果是本地對象,更好理解;如果是遠程對象,就按照我們上面所講的來理解,即將遠程對象的「引用」從一個進程映射到另一個進程中,於是當使用這個遠程對象時,實際上就是使用遠程對象在本地的一個「引用」,類似於把這個遠程對象當作一個本地對象在使用。這也就是Binder與其他IPC機制不同的地方。
這個本地「對象」與遠程對象的「引用」有什麼不同呢?本地「對象」表示本地進程的地址空間的一個地址,而遠程對象的「引用」則是一個抽象的32位句柄。它們之間是互斥的:所有的進程本地對象都是本地進程的一個地址(address、ptr、binder),所有的遠程進程的對象的「引用」都是一個句柄。對於發送者進程來說,不管是「對象」還是「引用」,它都會認為被發送的Binder對象是一個遠程對象的句柄(即遠程對象的「引用」)。但是,當Binder對象的數據被發送到遠端接收進程時,遠端接收進程則會認為該Binder對象是一個本地對象地址(即本地對象)。正如我們之前說的,當Binder對象被接收進程接收後,不管該Binder對象是本地的還是遠程的,它都會被當作一個本地進程來處理。因此,從第三方的角度來說,儘管名稱不同,對於一次完整的Binder調用,都將指向同一個對象,Binder驅動則負責兩種不同名稱的對象的正確映射,這樣才能把數據發送給正確的進程進行通信。這個映射關係也是進程間引用對象的基礎,對一個對象的引用,在遠程是句柄,在本地則是地址(即本地對象的地址)。
後續IT168移動頻道會介紹分析該機制中所使用的數據結構體,然後再對整個流程進行分析,敬請關注。