Android Binder驅動 原理和實現

2021-06-10 06:18:06 字數 2115 閱讀 8182

大家應該對binder有了基本的認識了。任何上層應用程式介面和使用者操作都需要底層硬體裝置驅動的支援,並為其提供各種操作介面。本節首先從binder的驅動實現入手,分析其原理和它提供給使用者層使用的介面。

一、binder驅動的原理

為了完成程序間通訊,binder採用了aidl(android inte***ce 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不僅可以與本地程序通訊,還可以與遠端程序通訊;這裡的本地程序就是我們所說的本地物件,而遠端程序則是我們所說的遠端服務的乙個「引用」 。

binder的實質就是要把物件從乙個程序對映到另乙個程序中,而不管這個物件是本地的還是遠端的。如果是本地物件,更好理解;如果是遠端物件,就按照我們上面所講的來理解,即將遠端物件的「引用」從乙個程序對映到另乙個程序中,於是當使用這個遠端物件時,實際上就是使用遠端物件在本地的乙個「引用」,類似於把這個遠端物件當作乙個本地物件在使用。這也就是binder與其他ipc機制不同的地方。

這個本地「物件」與遠端物件的「引用」有什麼不同呢?本地「物件」表示本地程序的位址空間的乙個位址,而遠端物件的「引用」則是乙個抽象的32位控制代碼。它們之間是互斥的:所有的程序本地物件都是本地程序的乙個位址(address、ptr、binder),所有的遠端程序的物件的「引用」都是乙個控制代碼。對於傳送者程序來說,不管是「物件」還是「引用」,它都會認為被傳送的binder物件是乙個遠端物件的控制代碼(即遠端物件的「引用」)。但是,當binder物件的資料被傳送到遠端接收程序時,遠端接收程序則會認為該binder物件是乙個本地物件位址(即本地物件)。正如我們之前說的,當binder物件被接收程序接收後,不管該binder物件是本地的還是遠端的,它都會被當作乙個本地程序來處理。因此,從第三方的角度來說,儘管名稱不同,對於一次完整的binder呼叫,都將指向同乙個物件,binder驅動則負責兩種不同名稱的物件的正確對映,這樣才能把資料傳送給正確的程序進行通訊。這個對映關係也是程序間引用物件的基礎,對乙個物件的引用,在遠端是控制代碼,在本地則是位址(即本地物件的位址)。

android binder機制詳解

1.直觀來說,binder是android中的乙個類,它繼承了ibinder介面 2.從ipc角度來說,binder是android中的一種跨程序通訊方式,binder還可以理解為一種虛擬的物理裝置,它的裝置驅動是 dev binder,該通訊方式在linux中沒有 3.從android frame...

Android Binder學習趣事

看android原始碼無論如何繞不開binder,因此我一直對binder的實現機制有濃厚的興趣。無奈本人功力不夠,所以對此一直沒有清晰的認識。看了網上一些分析binder的文章,基本都是原始碼分析,我覺得對於binder這樣一種比較複雜的框架,最好不要一開始就進入到原始碼這麼細節的層面,很容易找不...

Android Binder學習資料整理

1.binder相關資料結構 2.android深入淺出之binder機制 binder使用流程 3.android binder設計與實現 設計篇 原理 4.android程序間通訊 ipc 機制binder簡要介紹和學習計畫 1.service manager是如何成為乙個守護程序的?即serv...