Binder采用了AIDL来描述进程间的接口。在实际实现中,Binder是作为一个特殊的字符型设备而存在的,其设备节点为/dev/binder。实际实现代码有以下两个文件实现。
kernel/drivers/staging/binder.h
kernel/drivers/staging/binder.c
工作流程:
1、客户端首先获得服务器端的代理对象。
2、客户端通过调用服务器代理对象的方式向服务器端发送请求。
3、代理对象将用户请求通过Binder驱动发送到服务器进程。
4、服务器进程处理用户请求,并通过Binder驱动发送到服务器进程。
5、客户端收到服务端的返回结果。
所包含的数据结构
binder_work。表示在binder驱动中进程所要处理的工作项。
struct binder_work{
struct list_head entry;
enum{
BINDER_WORK_TRANSACTION=1,
BINDER_WORK_TRANSACTION_COMPLETE,
BINDER_WORK_NODE,
BINDER_WORK_DEAD_BINDER,
BINDER_WORK_DEAD_BINDER_AND_CLEAR,
BINDER_WORK_CLEAR_DEATH_NOTIFICATION
}type;
};
binder_node。定义Binder实体对象。在Android系统中,每一个Service组件在Binder驱动程序中都有一个Binder实体对象。
struct binder_node{
int debug_id;
struct binder_work work;
union{
struct rb_node rb_node;
struct hlist_node dead_node;
};
struct binder_proc *proc;
struct hlist_head refs;
int interanl_strong_refs;
int local_weak_refs;
int local_strong_refs;
void __user *ptr;
void __user *cookie;
unsigned has_strong_ref:1;
unsigned pending_strong_ref:1;
unsigned has_weak_ref:1;
unsigned pending_weak_ref:1;
unsigned has_async_transaction:1;
unsigned accept_fds:1;
unsigned min_priority:8;
struct list_head async_todo;
}
binder_ref用于描述一个Binder引用对象。在Android系统中,每一个Client组件在Binder驱动程序中都有一个Binder引用对象。
struct binder_ref{
int debug_id;
struct rb_node rb_node_desc;
struct rb_node rb_node_node;
struct hlist_node node_entry;
struct binder_proc *proc;
struct binder_node *node;
uint32_t desc;
int strong;
int weak;
struct binder_ref_death *death;
}
binder_ref_death是一个通知结构体,只要某进程对某binder引用订阅了其实体的死亡通知,那么binder驱动将会为该binder引用建立一个binder_ref_death通知结构体,将其保存在当前进程的对应binder引用结构体的death域中。
struct binder_ref_death{
struct binder_work work;
void __user *cookie;
}
binder_buffer用于描述一个内核缓冲区,能够在进程之间传输数据。
struct binder_buffer{
struct list_head entry;
struct rb_node rb_node;
unsigned free:1;
unsigned allow_user_free:1;
unsigned async_transaction:1;
unsigned debug_id:29;
struct binder_transaction *transaction;
struct binder_node *trraget_node;
size_t data_size;
size_t offsets_size;
uint8_t data[0];
}
- entry:构建一个双向链表;
- rb_node:表示一个红黑树节点;
- transaction:用于中转请求和返回结果;
- target_node:表示一个目标节点;
- data_size:表示数据的大小;
- offsets_size:表示一个偏移量;
- data[0]:用于存储实际数据。
binder_proc表示正在使用Binder进程通信机制的进程,能够保存调用Binder的各个进程或线程信息,如线程ID、进程ID、Binder状态信息等。