溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

binder 機(jī)制流程分析

發(fā)布時間:2020-08-22 05:48:32 來源:網(wǎng)絡(luò) 閱讀:363 作者:上帝之子521 欄目:系統(tǒng)運(yùn)維

????????前面我們對著代碼分析了整個 test_client 和 test_server 的整個流程,下面我們再來總結(jié)下整個流程。

????????假設(shè)我們有此種服務(wù)場景:test_server 提供 HelloService 服務(wù),還有 GoodbyeService 服務(wù);test_client 來使用服務(wù)。

????

????????對于 test_server 來說:

????????????1. addService:

????????????????a. test_server 為每個服務(wù)構(gòu)造 flat_binder_object 結(jié)構(gòu)體。它里面中含有的 binder 指針和 cookie 指針 指向不同服務(wù);

????????????????b. 調(diào)用 ioctl 發(fā)送數(shù)據(jù):

????????????????????b.1 數(shù)據(jù)中含有 flat_binder_object + 服務(wù)名稱;

????????????????????b.2 數(shù)據(jù)中含有“目的地”:handle = 0,表示發(fā)給 SM;

????????????????c. 上面調(diào)用 ioctl ,那么驅(qū)動程序?qū)γ恳粋€ flat_binder_object 構(gòu)造 binder_node 結(jié)構(gòu)體。它里面中含有的 ptr 和 cookie 指針是來自于 flat_binder_object 結(jié)構(gòu)體里的 binder 和 cookie 指針;

????????????????d. 驅(qū)動程序根據(jù) handle = 0 找到 SM,然后把數(shù)據(jù)發(fā)給 SM 并且創(chuàng)建 binder_ref 結(jié)構(gòu)體;

????????????????e. 在 SM 里記錄服務(wù)的名稱及 desc 值。

????????對于 test_client 來說:

????????????2. getService:

????????????????a. test_client 構(gòu)造數(shù)據(jù)。數(shù)據(jù) = 名稱 +“目的(指的是 handle = 0)”;

????????????????b. 調(diào)用 ioctl 發(fā)送數(shù)據(jù);

????????????????c. 那么驅(qū)動程序根據(jù) handle = 0 找到 SM 并把數(shù)據(jù)發(fā)給 SM;

????????????????d. SM 從 svclist 鏈表中找到對應(yīng)項(xiàng)。比如根據(jù)名“Hello”找到第一項(xiàng),handle = 1;

????????????????e. SM 通過 ioctl 返回?cái)?shù)據(jù)。數(shù)據(jù) = flat_binder_object,flat_binder_object 結(jié)構(gòu)體中的 type 表示引用 binder_ref,handle = 1;

????????????????f. 驅(qū)動:發(fā)現(xiàn)數(shù)據(jù)中含有 flat_binder_object,且 type 為引用,從 SM 的 binder_ref 鏈表中找到對應(yīng)項(xiàng)(傳入的 handle == binder_ref.desc),再找到 binder_node,最后為 test_client 建立 binder_ref;

????????對于 SM 來說:

????????????3. 那么 test_client 是怎么使用 HelloService?

????????????????a. 構(gòu)造數(shù)據(jù),數(shù)據(jù)中含有 code(調(diào)用哪個函數(shù)),“目的”handle = 1;

????????????????b. 使用 ioctl 發(fā)數(shù)據(jù);

????????????????c. 驅(qū)動:去除 handle = 1,找到 binder_ref,進(jìn)而找到 binder_node,再找到 test_server;最后把數(shù)據(jù)傳入給 test_server,并且在數(shù)據(jù)中設(shè)置(ptr 和 cookie) 等于 binder_node 的(ptr 和 cookie);

????????????????d. test_server 根據(jù)(ptr 和 cookie)知道調(diào)用的是哪個服務(wù);

????????1、那么在 test_server 中,驅(qū)動構(gòu)造出 binder_node 結(jié)構(gòu)體(放在鏈表中)包含有 HelloService 和 GoodbyeService 服務(wù)。binder_node 結(jié)構(gòu)體中包含的 ptr 和 cookie 和 proc,proc 結(jié)構(gòu)體指向的就是進(jìn)程 test_server;

????????2、在 SM 中,驅(qū)動同樣也構(gòu)造出 binder_ref 結(jié)構(gòu)體(也是以鏈表的形式)包含有 HelloService 和 GoodbyeService 服務(wù)。binder_ref 結(jié)構(gòu)體中包含的 desc 和 node,此 node 指向的便是前面的 test_server 中的 binder_node 結(jié)構(gòu)體找到對應(yīng)服務(wù);

????????3、在 test_client 中,驅(qū)動同樣也構(gòu)造出 binder_ref 結(jié)構(gòu)體(也是以鏈表的形式)包含有 HelloService 和 GoodbyeService 服務(wù)。binder_ref 結(jié)構(gòu)體中包含的 desc 和 node,此 node 指向的便是前面的 SM 中的 binder_node 結(jié)構(gòu)體;

????????同樣 test_client 根據(jù) desc 找到對應(yīng)的具體服務(wù)名(哪個服務(wù),Hello 或 Goodbye 服務(wù));

????????此時 binder 系統(tǒng)的流程調(diào)用已經(jīng)非常明了了,那么此系統(tǒng)中的最核心的函數(shù)是 ioctl;test_client 端中最核心的數(shù)據(jù)是 handle,test_server 端最核心的數(shù)據(jù)是 ptr 和 cookie;

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI