关于Binder的点点滴滴(二)
生活随笔
收集整理的這篇文章主要介紹了
关于Binder的点点滴滴(二)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
http://www.linuxidc.com/Linux/2011-07/39271p2.htm
4、Binder協議 Binder協議基本格式是(命令+數據),使用ioctl(fd, cmd, arg)函數實現交互。其中cmd傳遞命令,arg傳遞參數,不同的命令需要傳遞的參數不同。 4、1 Binder所有命令及其所對應的數據:BINDER_WRITE_READ: (S: 向Binder寫入或讀取數據,參數分兩部分,讀和寫,先寫后讀。 )該命令向Binder寫入或讀取數據。參數分為兩段:寫部分和讀部分。如果write_size不為0就先將write_buffer里的數據寫入 Binder;如果read_size不為0再從Binder中讀取數據存入read_buffer中。write_consumed和 read_consumed表示操作完成時Binder驅動實際寫入或讀出的數據個數。參數:struct binder_write_read {?
? ? ? ? signed long write_size;
? ? ? ? signed long write_consumed;
? ? ? ? unsigned long write_buffer;
? ? ? ? signed long read_size;
? ? ? ? signed long read_consumed;
? ? ? ? unsigned long read_buffer;
? ? ? };BINDER_SET_MAX_THREADS:該命令告知Binder驅動接收方(通常是Server端)線程池中最大的線程數。由于Client是并發向Server端發送請求的,Server端必須開辟線程池為這些并發請求提供服務。告知驅動線程池的最大值是為了讓驅動在線程達到該值時不要再命令接收端啟動新的線程。
參數:int max_threads;BINDER_SET_CONTEXT_MGR:將當前進程注冊為SMgr。系統中只能存在一個SMgr。只要當前的SMgr沒有調用close()關閉Binder驅動就不能有別的進程可以成為SMgr。?BINDER_THREAD_EXIT?:通知Binder驅動當前線程退出了。Binder會為所有參與Binder通信的線程(包括Server線程池中的線程和Client發出請求的線程)建立相應的數據結構。這些線程在退出時必須通知驅動釋放相應的數據結構。
BINDER_VERSION:獲得Binder驅動的版本號。
其中常用的命令是BINDER_WRITE_READ。該命令的參數包括兩部分數據:一部分是向Binder寫入的數據,一部分是要從 Binder讀出的數據,驅動程序先處理寫部分再處理讀部分。這樣安排的好處是應用程序可以很靈活地處理命令的同步或異步。例如若要發送異步命令可以只填入寫部分而將read_size置成0;若要只從Binder獲得數據可以將寫部分置空即write_size置成0;若要發送請求并同步等待返回數據可以將兩部分都置上。
4.2 BINDER_WRITE_READ 之寫操作
Binder寫操作的數據時格式同樣也是(命令+數據)。這時候命令和數據都存放在binder_write_read結構write_buffer域指向的內存空間里,多條命令可以連續存放。數據緊接著存放在命令后面,格式根據命令不同而不同。Binder寫操作支持的命令(cmd):
BC_TRANSACTION & BC_REPLY:BC_TRANSACTION用于寫入請求數據;BC_REPLY用于寫入回復數據。其后面緊接著一個 binder_transaction_data結構體表明要寫入的數據。
arg:struct binder_transaction_data
BC_FREE_BUFFER:釋放一塊映射的內存。Binder接收方通過mmap()映射一塊較大的內存空間,Binder驅動基于這片內存采用最佳匹配算法實現接收數據緩存的動態分配和釋放,滿足并發請求對接收緩存區的需求。應用程序處理完這片數據后必須盡快使用該命令釋放緩存區,否則會因為緩存區耗盡而無法接收新數據。
BC_INCREFS & BC_ACQUIRE & BC_RELEASE & BC_DECREFS:這組命令增加或減少Binder的引用計數,用以實強指針或弱指針功能。
arg:32位Binder引用號
4、Binder協議 Binder協議基本格式是(命令+數據),使用ioctl(fd, cmd, arg)函數實現交互。其中cmd傳遞命令,arg傳遞參數,不同的命令需要傳遞的參數不同。 4、1 Binder所有命令及其所對應的數據:BINDER_WRITE_READ: (S: 向Binder寫入或讀取數據,參數分兩部分,讀和寫,先寫后讀。 )該命令向Binder寫入或讀取數據。參數分為兩段:寫部分和讀部分。如果write_size不為0就先將write_buffer里的數據寫入 Binder;如果read_size不為0再從Binder中讀取數據存入read_buffer中。write_consumed和 read_consumed表示操作完成時Binder驅動實際寫入或讀出的數據個數。參數:struct binder_write_read {?
? ? ? ? signed long write_size;
? ? ? ? signed long write_consumed;
? ? ? ? unsigned long write_buffer;
? ? ? ? signed long read_size;
? ? ? ? signed long read_consumed;
? ? ? ? unsigned long read_buffer;
? ? ? };BINDER_SET_MAX_THREADS:該命令告知Binder驅動接收方(通常是Server端)線程池中最大的線程數。由于Client是并發向Server端發送請求的,Server端必須開辟線程池為這些并發請求提供服務。告知驅動線程池的最大值是為了讓驅動在線程達到該值時不要再命令接收端啟動新的線程。
參數:int max_threads;BINDER_SET_CONTEXT_MGR:將當前進程注冊為SMgr。系統中只能存在一個SMgr。只要當前的SMgr沒有調用close()關閉Binder驅動就不能有別的進程可以成為SMgr。?BINDER_THREAD_EXIT?:通知Binder驅動當前線程退出了。Binder會為所有參與Binder通信的線程(包括Server線程池中的線程和Client發出請求的線程)建立相應的數據結構。這些線程在退出時必須通知驅動釋放相應的數據結構。
BINDER_VERSION:獲得Binder驅動的版本號。
其中常用的命令是BINDER_WRITE_READ。該命令的參數包括兩部分數據:一部分是向Binder寫入的數據,一部分是要從 Binder讀出的數據,驅動程序先處理寫部分再處理讀部分。這樣安排的好處是應用程序可以很靈活地處理命令的同步或異步。例如若要發送異步命令可以只填入寫部分而將read_size置成0;若要只從Binder獲得數據可以將寫部分置空即write_size置成0;若要發送請求并同步等待返回數據可以將兩部分都置上。
4.2 BINDER_WRITE_READ 之寫操作
Binder寫操作的數據時格式同樣也是(命令+數據)。這時候命令和數據都存放在binder_write_read結構write_buffer域指向的內存空間里,多條命令可以連續存放。數據緊接著存放在命令后面,格式根據命令不同而不同。Binder寫操作支持的命令(cmd):
BC_TRANSACTION & BC_REPLY:BC_TRANSACTION用于寫入請求數據;BC_REPLY用于寫入回復數據。其后面緊接著一個 binder_transaction_data結構體表明要寫入的數據。
arg:struct binder_transaction_data
BC_FREE_BUFFER:釋放一塊映射的內存。Binder接收方通過mmap()映射一塊較大的內存空間,Binder驅動基于這片內存采用最佳匹配算法實現接收數據緩存的動態分配和釋放,滿足并發請求對接收緩存區的需求。應用程序處理完這片數據后必須盡快使用該命令釋放緩存區,否則會因為緩存區耗盡而無法接收新數據。
BC_INCREFS & BC_ACQUIRE & BC_RELEASE & BC_DECREFS:這組命令增加或減少Binder的引用計數,用以實強指針或弱指針功能。
arg:32位Binder引用號
轉載于:https://blog.51cto.com/1881577/1093272
總結
以上是生活随笔為你收集整理的关于Binder的点点滴滴(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦到好多玉米粒是什么意思
- 下一篇: 做梦梦到雪花飘飘是什么征兆