android binder筆記(一)
最近在看韋老師的android binder視頻 ,記錄下個人對視頻學習的理解。
學習需要記錄與分享,如果有誤,希望得到大家的指正!
IPC:兩個進程間數據通信的一種方式
RPC:一個進程調用另外一個進程的方法
比如A進程要調用驅動的 led_open 但是A沒有權限。只能通過系統程序的B進程來調用
那麽 A 將要調用的方法 調用的參數 發給B ,B獲取數據 並解析出來 然後執行led_open函數
那麽A如何將數據發給B呢 ?
A怎麽找到B呢?這裏就引入一個 servicemanager
1.這裏binder驅動 就是作為全局的數據傳遞的IPC服務,它負責將數據在所有進程之間的共享管理
2.進程間通訊 通過註冊到binder驅動中的一個handler(整數)來標識
也就是A進程告訴binder 我要向0x123 這個handler的進程發數據,並標誌這個buffer的handler為0x123
B進程會輪詢0x123所標誌的buffer 並從中獲取數據
3.servicemanager,的作用相當於一個中間機構,b進程向它註冊服務,a進程從它獲取服務
b進程向它註冊的時候 提供給了一個服務名+b的hander
a進程從它獲取服務的時候,可以通過一個服務名找到 b的handler
4.a 怎麽找到servicemanage的?
因為servicemanage向binder註冊的時候,就聲明我是servicemanage,那麽binder驅動將指定它的hander是0
我們可以向0的handler發送數據 ,其中code是要訪問的方法, binder_io是要訪問的參數
frameworks\native\cmds\servicemanager
service_manager.c :
a. binder_open
b. binder_become_context_manager
c. binder_loop(bs, svcmgr_handler);
c.1 res = ioctl(bs->fd, BINDER_WRITE_READ, &bwr);
c.2 binder_parse
// 解析
// 處理 : svcmgr_handler 這裏就是獲取與註冊服務
SVC_MGR_GET_SERVICE/SVC_MGR_CHECK_SERVICE : 獲取服務
SVC_MGR_ADD_SERVICE : 註冊服務
// 回復
bctest.c 測試文件
註冊服務的過程:一般在B進程也就是service進程中調用
a. binder_open
b. binder_call(bs, &msg, &reply, 0, SVC_MGR_ADD_SERVICE)
msg // 含有服務的名字
reply // 它會含有servicemanager回復的數據
0 // 0表示servicemanager
SVC_MGR_ADD_SERVICE // code: 表示要調用servicemanager中的"addservice函數"
獲取服務的過程: 一般在A進程也就是client中調用
a. binder_open
b. binder_call(bs, &msg, &reply, target, SVC_MGR_CHECK_SERVICE)
// 含有服務的名字
// 它會含有servicemanager回復的數據, 表示提供服務的進程
// 0表示servicemanager
// code: 表示要調用servicemanager中的"getservice函數"
關鍵函數binder_call的分析
android binder筆記(一)