一 binder设备打开的函数实现 binder_open
路径:kernel/drivers/android/binder.c
static int binder_open(struct inode *nodp, struct file *filp)
{
struct binder_proc *proc;
binder_debug(BINDER_DEBUG_OPEN_CLOSE, "binder_open: %d:%d\n",
current->group_leader->pid, current->pid);
/*分配binder_proc结构体*/
proc = kzalloc(sizeof(*proc), GFP_KERNEL);
if (proc == NULL)
return -ENOMEM;
/*增加线程引用计数*/
get_task_struct(current);
proc->tsk = current;
/*初始化todo队列,用于存放待处理的请求(server端)*/
INIT_LIST_HEAD(&proc->todo);
/*初始化wait队列*,这个队列用于等待返回结果(client端)或者等待请求(server端)/
init_waitqueue_head(&proc->wait);
proc->default_priority = task_nice(current);
binder_lock(__func__);
/*类型为BINDER_STAT_PROC对象的创建个数加1*/
binder_stats_created(BINDER_STAT_PROC);
/*将创建的binder_proc链入binder_procs的哈希链表中*/
hlist_add_head(&proc->proc_node, &binder_procs);
/*记录当前进程的pid*/
proc->pid = current->group_leader->pid;
INIT_LIST_HEAD(&proc->delivered_death);
/*将binder_proc存放在filp的private_data域,以便于在之后的mmap、ioctl中获取*/
filp->private_data = proc;
binder_unlock(__func__);
if (binder_debugfs_dir_entry_proc) {
char strbuf[11];
snprintf(strbuf, sizeof(strbuf), "%u", proc->pid);
/*创建/sys/kernel/debug/binde/proc/pid文件*/
proc->debugfs_entry = debugfs_create_file(strbuf, S_IRUGO,
binder_debugfs_dir_entry_proc, proc, &binder_proc_fops);
}
return 0;
}
总的来说,binder_open
的实现相对比较直观:
- 首先创建了
binder_proc
结构体实例proc
- 接着开始初始化一系列成员:
tsk
,todo
,wait
,default_priority
,pid
,delivered_death
。 - 更新了统计数据:
binder_proc
的创建个数加一 - 将
binder_proc
链入binder_procs
哈希链表中; - 紧接着将初始化好的
proc
,存放到filp->private_data
中,以便后续使用。 - 最后查看是否创建的了
/sys/kernel/debug/binde/proc/
目录,有的话再创建一个/sys/kernel/debug/binde/proc/pid
文件。