Binder驱动之打开设备----binder_open
16lz
2021-01-24
一 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
文件。
更多相关文章
- Android(安卓)筆記-Linux Kernel SMP (Symmetric Multi-Processo
- Android的postOnAnimation分析
- android 百度地图 AutoCompleteTextView联想刷新实现检索
- Android(安卓)常见工具类封装
- TabHost 和 FragmentTabHost
- Android使用MediaCodec将摄像头采集的视频编码为h264
- Android微信SDK实现分享
- 走进Java Android(安卓)的线程世界
- Android(安卓)消息传递机制 - Looper/Handler/MessageQueue/Mess