美文网首页
再谈binder_open

再谈binder_open

作者: Wi1ls努力努力再努力 | 来源:发表于2020-11-09 14:18 被阅读0次

    基于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

          本文链接:https://www.haomeiwen.com/subject/ewulbktx.html