Binder學習 二 Binder機制解析

2021-09-11 09:05:00 字數 1729 閱讀 8403

程序隔離

程序隔離是為保護作業系統中程序互不干擾而設計的一組不同硬體和軟體的技術。這個技術是為了避免程序a寫入程序b的情況發生。 程序的隔離實現,使用了虛擬位址空間。

虛擬位址

虛擬位址是對整個記憶體的抽像描述。它是相對於物理記憶體來講的,可以直接理解成「不真實的」,「假的」記憶體,例如,乙個0x08000000記憶體位址,它並不對就實體地址上那個大陣列中0x08000000 - 1那個位址元素;之所以是這樣,是因為現代作業系統都提供了一種記憶體管理的抽像,即虛擬記憶體(virtual memory)。程序使用虛擬記憶體中的位址,由作業系統協助相關硬體,把它「轉換」成真正的實體地址。

由於linux的程序隔離,所以導致了程序間不能直接進行通訊,那麼linux有沒有其它的通訊方式呢,如果有的話,為什麼要使用binder作為ipc的通訊方式?帶著這些疑問,來對binder機制進行一步一步的分析。

ipc原理

ipc機制

client程序向server程序通訊,是利用程序間可共享的核心記憶體空間來完成底層通訊工作的,client端與server端程序往往採用ioctl等方法跟核心空間的驅動進行互動。

ipc種類

ipc種類

binder原理

雖然,linux程序間通訊有很多種方式,但是android並沒有採用以上幾種,而是使用了binder機制,在分析原因前,還是先看看什麼是binder機制以及binder機制的特點:

binder原理

binder從字面意思來看是黏合劑,黏結劑的意思,那麼它的作用必然是把什麼東西連線在一起呢,在android系統的binder機制中,由一系統元件組成,分別是client、server、service manager和binder驅動程式,其中client、server和service manager執行在使用者空間,binder驅動程式執行核心空間。binder就是一種把這四個元件粘合在一起的粘結劑了,其中,核心元件便是binder驅動程式了,service manager提供了輔助管理的功能,client和server正是在binder驅動和service manager提供的基礎設施上,進行client-server之間的通訊。service manager和binder驅動已經在android平台中實現好,開發者只要按照規範實現自己的client和server元件就可以了。

binder架構

binder架構

binder通訊流程

binder通訊流程

雖然android已經有很多的ipc方式了,但是android依然採用binder來進行執行緒間通訊,主要是從效能和安全性以及穩定性的角度來考慮的。

管道:在建立時分配乙個page大小的記憶體,快取區大小比較有限;

訊息佇列:資訊複製兩次,額外的cpu消耗;不合適頻繁或資訊量大的通訊;

套接字:作為更通用的介面,傳輸效率低,主要用於不通機器或跨網路的通訊;

訊號量:常作為一種鎖機制,防止某程序正在訪問共享資源時,其他程序也訪問該資源。因此,主要作為程序間以及同一程序內不同執行緒之間的同步手段。

訊號: 不適用於資訊交換,更適用於程序中斷控制,比如非法記憶體訪問,殺死某個程序等;

android之所以採用binder機制來進行通訊,主要是基於效能,安全以及穩定性來考慮,binder基於 client-server通訊模式,傳輸過程只需一次拷貝,為傳送發新增uid/pid身份,既支援實名binder也支援匿名binder,安全性高;

binder學習筆記(二)

ibookmanager bookmanager ibookmanager.stub.asinte ce service asinte ce就是實現這個轉換的。當客戶端和服務端位於同乙個程序,那麼此方法返回就是服務端的stub物件本身,否則返回式系統封裝後的stub.proxy這個 物件。用形象的說...

Binder系列10 Binder執行緒池管理

在系列1中我們知道 binder 通訊,歸根結底是位於不同程序中的執行緒之間的通訊 假如程序 s 是 server 端,提供 binder 實體,執行緒 t1 從 client 程序 c 中通過 binder 的引用向程序 s 傳送請求。s 為了處理這個請求需要啟動執行緒 t2,而此時執行緒 t1 ...

Binder機制簡介

binder是一種程序間通訊機制,通俗一點,其實是提供遠端過程呼叫機制 rpc 傳輸效能 一次拷貝 易用性 相對於共享記憶體 安全性 許可權分離 servicemanager proxy client server 匿名共享記憶體方式 實現乙個binder通訊例項,需要經過一下步驟 1 獲得serv...