進(jìn)程間通訊——Binder

Binder主要涉及以下四個組成元素:

  • Binder驅(qū)動
  • Service Manger
  • Binder Client
  • Binder Server
    Binder的本質(zhì)就是進(jìn)程1希望與進(jìn)程2進(jìn)行交互,它們之間必須借助Binder驅(qū)動來實(shí)現(xiàn)通訊,Service Manner用于提供進(jìn)程的地址信息。

Binder驅(qū)動

Binder驅(qū)動是一個標(biāo)準(zhǔn)的Linux驅(qū)動,具體而言,Binder Driver會把自己注冊成一個misc device,并向上層提供一個/dev/binder結(jié)點(diǎn)——Binder結(jié)點(diǎn)并不對應(yīng)真實(shí)的硬件設(shè)備,Binder驅(qū)動運(yùn)行于內(nèi)核態(tài),可以提供open(),ioctl(),mmap()等常用的文件操作。
使用流程:

1、打開Binder驅(qū)動

層次進(jìn)程在訪問Binder驅(qū)動時,首先需要打開/dev/binder結(jié)點(diǎn),這個操作最終實(shí)現(xiàn)的是binder_open()方法。

2、內(nèi)存映射

對于應(yīng)用程序而言,通過mmap()返回值得到一個內(nèi)存地址(虛擬地址),這個地址通過虛擬內(nèi)存轉(zhuǎn)換(分段、分頁)后,最終會指向物理內(nèi)存的某個位置。
對于Binder驅(qū)動而言,它有一個指針指向某個虛擬內(nèi)存地址,而經(jīng)過虛擬內(nèi)存轉(zhuǎn)換后,它和應(yīng)用程序中指向的物理內(nèi)存處于同一個位置。
這時Binder和應(yīng)用程序就擁有了若干共用的物理內(nèi)存塊,當(dāng)兩個進(jìn)程共同指向相同的物理地址即可實(shí)現(xiàn)進(jìn)程間的數(shù)據(jù)共享,且Binder驅(qū)動只用了一次復(fù)制。


Binder內(nèi)存映射

3、binder_ioctl

這是Binder驅(qū)動實(shí)現(xiàn)業(yè)務(wù)的重要方法,Binder并不提供read()和write()等文件操作,最終由binder_ioctl來實(shí)現(xiàn)。

ServiceManger

ServiceManger的功能可以類比為互聯(lián)網(wǎng)中“DNS”服務(wù)器,“IP地址”為0,SM是一個標(biāo)準(zhǔn)的Binder Server,其他Binder Server向其注冊,Binder Client向其請求并查詢服務(wù)的ID。
ServiceManger內(nèi)部維護(hù)著一個svclist列表,用于存儲所有的Server相關(guān)信息(以svcinfo為數(shù)據(jù)結(jié)構(gòu)),查詢和注冊都是基于這個表展開的。

參考資料

  • 深入理解Android內(nèi)核設(shè)計(jì)思想. 林學(xué)森。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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