binder的内存管理
Server端在启动之后,对/dev/binder设备调用mmap,内核中的binder_mmap函数进行对应的处理:申请一块物理内存,然后Server端的用户空间和内核空间同时进行映射;当Client端发送请求时,请求将数据从Client进程的用户空间拷贝到Server端的内核内存中,因为用户空间和内核空间对该块物理内存进行了同步映射,因此Server端用户空间也可以获得数据了,下面对Server端用户空间与内核空间的同步映射关系进行讲解:
下面为用户空间调用binder_open进行注册过程:
struct binder_state *binder_open(const char* driver, size_t mapsize)
{
struct binder_state *bs;
struct binder_version vers;
bs = malloc(sizeof(*bs));
// 调用内核空间binder_open 生成binder_proc
bs->fd = open(driver, O_RDWR | O_CLOEXEC);
bs->mapsize = mapsize;
// 调用内核空间的binder_mmap 进行内存映射
bs->mapped = mmap(NULL, mapsize, PROT_READ, MAP_PRIVATE, bs->fd, 0);
}
mmap的前半部分的流程都是类似的,使用结构体vm_area_struct 来描述一个虚拟内存区域;在构造完毕vm_area_struct之后,如果有fd传入,就会判断当前文件描述符是否有mmap赋值,然后调用对应的内核mmap函数,大致的流程如下: