再谈binder_open
2020-11-09 本文已影响0人
Wi1ls努力努力再努力
基于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);
}
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驱动的初始化工作