再谈binder_open

基于Android7.0

先介绍下ProcessState,这个对象属于进程单例,属于native层,在改对象初始化的时候会进行binder_open()和binder_mmap(),可以认为这里是每个进程对于binder初始化的地方。

//ProcessState.cpp
ProcessState::ProcessState()
  : mDriverFD(open_driver())
  ...
{
  //void * mmap(void *start, size_t length, int port, int flag, int fd, off_t offset)
  //start:通常取0,表示内核来指定
  //length:映射内存区域大小
  //port: PROT_READ表示可读
  //flag: MAP_PRIVATE建立一个写入时拷贝的私有映射,MAP_NORESERVE不保留交换空间
  //经过哟一些列的函数调用最终执行到驱动程序的file_operation的mmap函数,在这里即binder_mmap函数
  mVMStart = mmap(0, BINDER_VM_SIZE, PROT_READ, MAP_PRIVATE | MAP_NORESERVER, mDriverFD, 0);
}

再谈binder_mmap


static int open_driver(){
  //这里就会调用到Binder驱动的binder_open函数
  int fd = open("/dev/binder", O_RDWR);
  fcntl(fd, F_SETFD, FD_CLOSEXEC);
  //在分析binder_ioctl再分析
  ioctl(fd, BINDER_SET_MAX_THREADS, &maxThreads);
}
static int binder_open(struct inode *nodp, struct file *filp){
  //该结构是某个进程在Binder驱动的代表
  struct binder_proc *proc;
  //内核分配内存
  proc = kzalloc(sizeof(*proc), GFP_KERNEL);
  //current是一个宏定义,表示获取当前进程的task_struct结构,表示某个进程在内核中的表示
  get_task_struct(current);
  //保存当前进程的task_struct到binder_proc中
  proc->tsk = current;
  //属于宏定义,表示初始化todo队列
  INIT_LIST_HEAD(&proc->todo);
  //初始化等待队列
  init_waitqueue_head(&proc->wait);
  //保存进程优先级
  proc->default_priority = task_nice(current);
  //将proc_node保存到Binder进程全局binder_procs链表
  hlist_add_head(&proc->proc_node, &binder_procs);
  //保存当前pid
  proc->pid = current->group_leader->pid;
  INIT_LIST_HEADER(&proc->delivered_death);
  //保存binder_proc,这样在其他binder其他相关函数都可以方便得到binder_proc
  filp->private_data = proc;
}

其实binder_open( )函数比较简单,就是在Binder驱动创建一个代表自身进程的binder_proc结构,同时保存一些必要的信息。
随后配合binder_mmap( ) 就算是完成了一个进程对于Binder驱动的初始化工作

你可能感兴趣的:(再谈binder_open)