一 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, piddelivered_death
  • 更新了统计数据:binder_proc的创建个数加一
  • binder_proc链入binder_procs哈希链表中;
  • 紧接着将初始化好的proc,存放到filp->private_data中,以便后续使用。
  • 最后查看是否创建的了/sys/kernel/debug/binde/proc/目录,有的话再创建一个/sys/kernel/debug/binde/proc/pid文件。

更多相关文章

  1. Android(安卓)筆記-Linux Kernel SMP (Symmetric Multi-Processo
  2. Android的postOnAnimation分析
  3. android 百度地图 AutoCompleteTextView联想刷新实现检索
  4. Android(安卓)常见工具类封装
  5. TabHost 和 FragmentTabHost
  6. Android使用MediaCodec将摄像头采集的视频编码为h264
  7. Android微信SDK实现分享
  8. 走进Java Android(安卓)的线程世界
  9. Android(安卓)消息传递机制 - Looper/Handler/MessageQueue/Mess

随机推荐

  1. android画笔错位问题的解决
  2. android shape corners 四个属性无效解决
  3. 关于Android中aidl的关键词in,out,inout
  4. 一、Android(安卓)NDK编程预备之Java jni
  5. Android视频解码及渲染
  6. Android(安卓)应用安装流程初探
  7. 【ALearning】第五章 Android相关组件介
  8. onContextItemSelected 与 onMenuItemSel
  9. Volley的简单使用
  10. android 的一些参数