android6.0已经把binder_buffer有关的操作和binder.c分开了,实现在binder_alloc.c文件里面
一、binder_alloc_mmap_handler函数进行map,先看这个结构体:
struct binder_alloc {
struct mutex mutex;
struct vm_area_struct *vma;
struct mm_struct *vma_vm_mm;
void *buffer; // map 的地址就是这里了
ptrdiff_t user_buffer_offset; //内核空间和用户空间的差
struct list_head buffers; //所有的buffers列表
struct rb_root free_buffers; //只进行了预定,没有分配,按大小排序
struct rb_root allocated_buffers; //已经分配了,按地址排序
size_t free_async_space; //用于异步请求的空间
struct binder_lru_page *pages;//所有的pages
size_t buffer_size; //总共的大小
uint32_t buffer_free;
int pid;
};
参数alloc和proc相关,也就是每个进程一个,vma用户调用传入参数
int binder_alloc_mmap_handler(struct binder_alloc *alloc,
struct vm_area_struct *vma);
这个函数流程比较简单,关键流程如下:
1、
area = get_vm_area(vma->vm_end - vma->vm_start, VM_IOREMAP);
alloc->buffer = area->addr;
alloc->user_buffer_offset =vma->vm_start - (uintptr_t)alloc->buffer;
预定空间,初始化alloc的buffer和user_