Binder驅動是如何維護本地Binder和Binder代理的映射關係

這裏寫圖片描述
通信過程:
binder設備驅動會爲每個進程分配一個數據結構binder_proc,每進程中的每個用到了binder通信的線程分配數據結構binder_thread。

binder設備驅動會爲服務進程中的每個服務對象分配數據結構binder_node,它隸屬於服務進程的binder_proc,即binder_node是binder_proc的子結構,binder_node中記錄了服務對象在服務進程中的地址;會爲客戶進程中每個引用分配binder_ref,binder_ref會指向客戶進程引用的服務對象的binder_node。

binder驅動爲客戶進程每個引用都會維護一個handle,它存在於binder_ref中(binder_ref.desc),它就像進程打開某個文件產生的文件描述符一樣,進程每引用一個服務,就會分配一個最小未使用的整數作爲handle。handle是客戶進程相關的,多個進程引用同一個服務得到的handle並不是一樣的。

當服務進程向ServiceManager註冊服務時,會帶上服務的名稱字符串,驅動會爲服務進程中的服務對象增加一個binder_node,歸屬於服務進程的binder_proc。

當把註冊服務的請求發給ServiceManager時,ServiceManager也是服務對象的一個引用者,驅動會爲ServiceManager增加一個binder_ref,指向服務對象的binder_node。驅動把binder_ref.desc(ServiceManager)作爲handle返回給ServiceManager,ServiceManager保存此handle和服務名稱字符串。

當客戶進程向ServiceManager獲取服務時,ServiceManager根據服務名稱字符串找到服務對象在ServiceManager進程中的handle。在ServiceManager的應答的過程中,驅動根據此handle在ServiceManager進程的binder_proc找到對應的binder_ref,並根據它找到服務對象的binder_node。然後,驅動會爲客戶進程增加一個binder_ref,指向服務對象的binder_node,最後把binder_ref.desc(客戶進程)作爲handle返回給客戶進程。

客戶進程使用得到的handle向服務進程發起請求,驅動會在根據此handle在客戶進程的binder_proc查找對應的binder_ref,並找到它指向的binder_node,並找到binder_node所屬的binder_proc,最終驅動把請求放入服務進程的接收隊列中。

服務進程收到請求後,從binder_node中找到服務對象的地址,然後調用該服務對象。所以,對於服務對象,在客戶進程中表現出來的是handle,在服務進程中表現出來的是地址,驅動會對它們進行映射。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章