一、IPC
?進程間通信(IPC,Inter-Process Communication)機制,用于解決不同進程間的數據交互問題。
不同進程之間用戶地址空間的變量和函數是不能相互訪問的,但是不同進程的內核地址空間是相同和共享的,我們可以借助內核地址空間作為中轉站來實現進程間數據的傳輸。
具體的我們在 B 進程使用 copy_from_user 將用戶態數據 int a
拷貝到內核態,這樣就可以在 A 進程的內核態中訪問到 int a
更進一步,可以在 A 進程中調用 copytouser 可以將 int a
從內核地址空間拷貝到用戶地址空間。至此,我們的進程 A 用戶態程序就可以訪問到進程 B 中的用戶地址空間數據 int a
了
二、binder是什么??
Binder 是 Android 系統中特有的?進程間通信(IPC,Inter-Process Communication)機制。
- 技術前身:Android 系統使用的 Binder 機制起源于 BeOS 操作系統的功能。BeOS 中的 OpenBinder 最初由 Be Inc. 開發,當時 Be 公司的工程師喬治?霍夫曼(George Hoffman)啟動了 OpenBinder 項目,后由 Dainne Hackborn 繼續開發。在 BeOS 被 Palm 收購后,OpenBinder 成為管理 PalmOS 6、Cobalt OS 進程的基礎。
- 應用到 Android:Dainne Hackborn 加入谷歌后,基于 OpenBinder 開發出了 Android Binder,用于實現 Android 的進程通信。它定義并實現了類似 Windows 系統的 COM 框架和 Unix 系統的 CORBA 框架的分布式組件框架,借鑒了 CORBA 中可像在本地執行一樣調用其他設備程序的先進理念(發展至今類似成熟的 RPC 理念) 。
為了訪問 int a
,需要拷貝兩次數據。能不能優化一下?我們可以通過 mmap 將進程 A 的用戶地址空間與內核地址空間進行映射,讓他們指向相同的物理地址空間:
完成映射后,B 進程只需調用一次 copyfromuser,A 進程的用戶空間中就可以訪問到 int a
了。這里就優化到了一次拷貝。
以上就是 binder 最基本的原理了。它相比傳統 Linux IPC(如管道、Socket、共享內存等)更高效、更適合移動設備的資源限制,其有以下幾個特點:
- 高性能:減少內存拷貝次數(僅需一次拷貝),優于傳統 IPC 的兩次拷貝(用戶空間 ? 內核空間 ? 用戶空間)。
Binder拷貝方式: 數據發送端(虛擬內存) ?copy_from_user --> 內核虛擬內存 ?<--mmap--> 數據接收端(虛擬內存) ?
內核虛擬內存和數據接收端虛擬內存采用mmap映射到同一塊物理內存,不存在拷貝動作,數據發送端(Client)要把IPC數據 拷貝到內核虛擬內存空間,存在一次拷貝,所以Binder只存在一次內存拷貝
- 面向對象:以 “接口” 為核心,支持面向對象的編程方式,方便開發者理解和使用。
- 安全性:可直接獲取進程 PID/UID,便于系統進行權限校驗(如訪問系統服務需聲明權限)。
- 跨進程通信的抽象化:將復雜的底層通信細節封裝為簡單的接口,降低開發者使用門檻。
二、Binder 機制的核心組件
Binder 機制由?用戶空間組件?和?內核空間組件?共同構成:
1. 用戶空間組件
- Client(客戶端):發起通信請求的進程(如應用程序)。
- Server(服務端):提供服務的進程(如系統服務?
SystemServer
)。 - ServiceManager:全局的服務管理進程,負責注冊、查詢服務,相當于 “服務目錄”。
2. 內核空間組件
- Binder 驅動(
drivers/staging/android/binder.c
):- 負責創建 Binder 設備文件(
/dev/binder
),供用戶空間進程訪問。 - 管理 Binder 節點(對應服務端對象)和引用(對應客戶端代理對象)。
- 實現進程間通信的核心邏輯,如數據傳輸、線程管理等。
- 負責創建 Binder 設備文件(
三、Binder 幾個關鍵概念
四、Binder 機制的核心原理
Binder 通信基于?C/S 架構:
其典型流程如下:?
服務注冊:
服務獲取:

通信過程:

?
ref:
十分鐘搞懂Android Binder機制_嗶哩嗶哩_bilibili
https://juejin.cn/post/7210175991837392933