android binder(三)binder.c函数分析
一、binder_call
int binder_call(struct binder_state *bs,struct binder_io *msg, struct binder_io *reply,uint32_t target, uint32_t code);
实现远程调用RPC,既然是远程函数调用,那么就有如下要素:
-
向谁发送数据:target
-
调用哪个函数:code
-
提供什么参数:msg
-
返回值:reply
如何使用?
- 构造参数:存放在buf中,用binder_io结构体描述
struct binder_io{char *data; /* pointer to read/write from */binder_size_t *offs; /* array of offsets */size_t data_avail; /* bytes available in data buffer */size_t offs_avail; /* entries available in offsets array */char *data0; /* start of data buffer */binder_size_t *offs0; /* start of offsets buffer */uint32_t flags;uint32_t unused;};
- 数据格式转换,将binder_io数据转换成驱动程序要求的binder_write_read数据
- 调用ioctl发送数据--ioctl(bs->fd, BINDER_WRITE_READ, &bwr);
struct binder_write_read {binder_size_t write_size;binder_size_t write_consumed;binder_uintptr_t write_buffer;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */binder_size_t read_size;binder_size_t read_consumed;binder_uintptr_t read_buffer;
};
- 调用ioctl接收数据--ioctl(bs->fd, BINDER_WRITE_READ, &bwr);