Android开发经验谈Android开发Android技术知识

Binder驱动之打开设备`binder_open`

2018-09-02  本文已影响12人  巫屋

一 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的实现相对比较直观:

上一篇 下一篇

猜你喜欢

热点阅读