打开Binder设备 -- binder_open

一 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文件。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
binder_openBinder机制中的一个函数,用于打开Binder驱动并返回一个Binder状态结构体。在该函数中,会调用copy_from_user函数从用户空间获取一个struct binder_write_read结构体,并将其作为参数传递给binder_thread_write和binder_thread_read函数。\[1\] 在Binder机制的Native层实现中,binder_open函数被用于开启Binder,并将自身注册为Binder进程的上下文,然后通过调用binder_loop函数来启动Binder循环。\[2\] 在binder_loop函数中,如果收到了Binder的读写消息信息,会调用binder_parse函数进行处理。binder_parse函数会将读取到的消息进行解析,并调用相应的处理函数进行处理。\[3\] #### 引用[.reference_title] - *1* [05.Binder系统:第6课第2节_Binder系统_驱动情景分析_打印数据交互过](https://blog.csdn.net/weixin_43013761/article/details/88171380)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [【Binder 机制】Native 层 Binder 机制分析 ( binder_loop | svcmgr_handler | binder.c | binder_parse )](https://blog.csdn.net/han1202012/article/details/120345228)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值