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引用号