Binder詳解

參考文章:https://blog.csdn.net/freekiteyu/article/details/70082302
參考文章:https://www.cnblogs.com/qingchen1984/p/5212755.html
一。Binder的由來:
在Linux內(nèi)核的操作系統(tǒng)中,為了數(shù)據(jù)的保護(hù),某些進(jìn)程之間是互不干擾的,這個(gè)技術(shù)叫做進(jìn)程隔離,操作系統(tǒng)中會(huì)給進(jìn)程分配一個(gè)虛擬地址空間供其使用,這也就是所謂的進(jìn)程獨(dú)享操作系統(tǒng),其實(shí)就是獨(dú)享這個(gè)虛擬地址空間。操作系統(tǒng)中進(jìn)程之間的數(shù)據(jù)是不共享的,要向讓進(jìn)程之間通信,就需要一種進(jìn)程間的通信機(jī)制,在Android中這個(gè)機(jī)制就是Binder通信機(jī)制。
Binder是Android系統(tǒng)中進(jìn)程間通訊(IPC)的一種方式,也是Android系統(tǒng)中最重要的特性之一。Android中的四大組件Activity,Service,Broadcast,ContentProvider,不同的App等都運(yùn)行在不同的進(jìn)程中,它是這些進(jìn)程間通訊的橋梁。正如其名“粘合劑”一樣,它把系統(tǒng)中各個(gè)組件粘合到了一起,是各個(gè)組件的橋梁。

image.png

實(shí)現(xiàn)Binder跨進(jìn)程間的通信是通過Clent-Servier模式,必須需要這四個(gè):
(比喻為打電話模式:手機(jī)A-通訊錄-電話基站-手機(jī)B
Client(客戶端)-ServiceManager-Binder驅(qū)動(dòng)-Server端

Binder的通信實(shí)現(xiàn)方式:
1.首先需要注冊(cè)服務(wù)端,只有注冊(cè)了服務(wù)端,客戶端才有通訊的目標(biāo),服務(wù)端通過 ServiceManager 注冊(cè)服務(wù),注冊(cè)的過程就是向 Binder 驅(qū)動(dòng)的全局鏈表( binder_procs) 中插入服務(wù)端的信息(binder_proc 結(jié)構(gòu)體,每個(gè) binder_proc 結(jié)構(gòu)體中都有 todo 任務(wù)隊(duì)列),然后向 ServiceManager 的 svcinfo 列表中緩存一下注冊(cè)的服務(wù)。
有了服務(wù)端,客戶端就可以跟服務(wù)端通訊了,通訊之前需要先獲取到服務(wù),拿到服務(wù)的代理,也可以理解為引用。比如下面的代碼:

//獲取WindowManager服務(wù)引用
WindowManager wm = (WindowManager)getSystemService(getApplication().WINDOW_SERVICE);

2.獲取服務(wù)端的方式就是通過 ServiceManager 向 svcinfo 列表中查詢一下返回服務(wù)端的代理,svcinfo 列表就是所有已注冊(cè)服務(wù)的通訊錄,保存了所有注冊(cè)的服務(wù)信息。

3.有了服務(wù)端的引用我們就可以向服務(wù)端發(fā)送請(qǐng)求了,通過 BinderProxy 將我們的請(qǐng)求參數(shù)發(fā)送給 ServiceManager,通過共享內(nèi)存的方式使用內(nèi)核方法 copy_from_user() 將我們的參數(shù)先拷貝到內(nèi)核空間,這時(shí)我們的客戶端進(jìn)入等待狀態(tài),然后 Binder 驅(qū)動(dòng)向服務(wù)端的 todo 隊(duì)列里面插入一條事務(wù),執(zhí)行完之后把執(zhí)行結(jié)果通過 copy_to_user() 將內(nèi)核的結(jié)果拷貝到用戶空間(這里只是執(zhí)行了拷貝命令,并沒有拷貝數(shù)據(jù),binder只進(jìn)行一次拷貝),喚醒等待的客戶端并把結(jié)果響應(yīng)回來,這樣就完成了一次通訊。

image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容