Binder進(jìn)程通信的基本原理
基礎(chǔ)
- Binder是基于
linux
驅(qū)動(dòng)設(shè)備的寸五,所以我們可以把Binder驅(qū)動(dòng)當(dāng)做文件設(shè)備打開(kāi) -
mmap
系統(tǒng)調(diào)用用于把一個(gè)設(shè)備或者文件的內(nèi)存映射到自己應(yīng)用程序的內(nèi)存空間中 -
A
進(jìn)程對(duì)Binder執(zhí)行mmap
調(diào)用鲸拥,然后A
內(nèi)存空間中就有Binder的地址妥粟,即A
中可以修改Binder中內(nèi)存的值渣锦,當(dāng)然Binder中的修改也會(huì)影響到A
,于是當(dāng)Binder去拷貝另一個(gè)應(yīng)用程序B
的一部分內(nèi)存到自己的內(nèi)存空間時(shí)(Bidner的內(nèi)存空間)沐扳,A
就可以直接訪(fǎng)問(wèn)到拷貝過(guò)來(lái)的B
的內(nèi)存空間了症脂,間而實(shí)現(xiàn)了A
和B
的內(nèi)存通信
ProcessState
ProcessState
是進(jìn)程單例的,會(huì)去打開(kāi)/dev/binder
驅(qū)動(dòng)媚狰,并且mmap
到當(dāng)前進(jìn)程的內(nèi)存空間
一個(gè)進(jìn)程開(kāi)始的時(shí)候就會(huì)初始化一個(gè)ProcessState
岛杀,然后就會(huì)去開(kāi)始binder
線(xiàn)程池循環(huán)等待指令到來(lái)
IPCThreadState
IPCThreadState
是線(xiàn)程單例,會(huì)去和binder驅(qū)動(dòng)
直接交互
BpBinder
Binder
的代理對(duì)象崭孤,其中主要就是持有mHandle
(編號(hào)),在和Binder驅(qū)動(dòng)
交互的時(shí)候使用mHandle
來(lái)尋找Binder
服務(wù)类嗤,對(duì)應(yīng)native
層的Binder
Binder驅(qū)動(dòng)
binder_proc
在Binder驅(qū)動(dòng)中,有一個(gè)binder_proc
的鏈頭的通過(guò)binder_proc隊(duì)列
持有了所有的binder
,相當(dāng)于每一次的binder_open
的時(shí)候就會(huì)創(chuàng)建一個(gè)binder_proc
表示當(dāng)前的binder
進(jìn)程辨宠,并且把它添加到Binder驅(qū)動(dòng)
紅黑樹(shù)上遗锣。
相當(dāng)于每一次我們的進(jìn)程打開(kāi)的binder驅(qū)動(dòng)
就會(huì)獲得驅(qū)動(dòng)上面的所有binder服務(wù)
所組成的鏈表,而我們發(fā)起IPC
的時(shí)候嗤形,就會(huì)根據(jù)binder服務(wù)
的編號(hào)進(jìn)行尋找,然后就會(huì)去發(fā)起數(shù)據(jù)傳遞(就是修改binder驅(qū)動(dòng)
內(nèi)存中的值)然后循環(huán)等待反饋精偿。對(duì)應(yīng)的binder服務(wù)端
則會(huì)在服務(wù)注冊(cè)的時(shí)候就一直循環(huán)等待客戶(hù)端的連接。binder_ioctl
binder_ioctl()
函數(shù)負(fù)責(zé)在兩個(gè)進(jìn)程間收發(fā)IPC數(shù)據(jù)和IPCreply
數(shù)據(jù)赋兵。binder thread pool
Binder線(xiàn)程池
在進(jìn)程frok
出來(lái)就會(huì)運(yùn)行起來(lái)笔咽,即等待客戶(hù)端的連接,但這個(gè)時(shí)候可能binder service
并沒(méi)有注冊(cè)霹期。
binder驅(qū)動(dòng)
找到對(duì)應(yīng)的service
需要的進(jìn)程
叶组,service名字
,方法標(biāo)記
经伙。
思想
在一塊大家都可以訪(fǎng)問(wèn)的內(nèi)存中進(jìn)行數(shù)據(jù)和指令的交換扶叉,而不同進(jìn)程中主要靠thread
的循環(huán)等待指令(事件驅(qū)動(dòng)),但是這樣交互很繁雜帕膜,所以又抽離出了一個(gè)manager(ServiceManager
)
每一個(gè)進(jìn)程開(kāi)始的時(shí)候都會(huì)進(jìn)行ProcessState
的初始化枣氧,會(huì)去打開(kāi)驅(qū)動(dòng),并提供接口去獲取mHandle=0
的Binder
,同時(shí)也會(huì)讓自己的Binder線(xiàn)程池循環(huán)起來(lái)垮刹。
binder
的調(diào)動(dòng)的是阻塞的达吞,阻塞的原理還是循環(huán)。所以客戶(hù)端的binder
IPC請(qǐng)求最好放到子線(xiàn)程去執(zhí)行荒典。