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ù)制。

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é)森。