【Binder 机制】分析 Android 内核源码中的 Binder 驱动源码 binder.c ( googlesource 中的 Android 内核源码 | 内核源码下载 )(二)

简介: 【Binder 机制】分析 Android 内核源码中的 Binder 驱动源码 binder.c ( googlesource 中的 Android 内核源码 | 内核源码下载 )(二)

二、分析 Binder 驱动源码 binder.c



1、binder_ioctl


在 Android Native 层中的 service_manager.c 中的 main 函数中 , 调用了 binder_become_context_manager(bs) , 将自己注册成 Binder 进程的上下文 , 其中调用的 ioctl 方法是内核中的方法 , 这是 IO Control 的简称 ;


int binder_become_context_manager(struct binder_state *bs)
{
    return ioctl(bs->fd, BINDER_SET_CONTEXT_MGR, 0);
}


上面调用的 ioctl 方法 , 就是下面的内核中的 Binder 驱动源码 binder.c 中的 static long binder_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) 方法 ;


Native 层传入的 cmd 参数是 BINDER_SET_CONTEXT_MGR , 因此这里的 switch 分支走 case BINDER_SET_CONTEXT_MGR: 分支 , 执行 binder_ioctl_set_ctx_mgr(filp, NULL) 方法 ;


case BINDER_SET_CONTEXT_MGR:
  ret = binder_ioctl_set_ctx_mgr(filp, NULL);
  if (ret)
    goto err;
  break;


binder.c 相关代码如下 :


static long binder_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
{
  int ret;
  struct binder_proc *proc = filp->private_data;
  struct binder_thread *thread;
  unsigned int size = _IOC_SIZE(cmd);
  void __user *ubuf = (void __user *)arg;
  /*pr_info("binder_ioctl: %d:%d %x %lx\n",
    proc->pid, current->pid, cmd, arg);*/
  binder_selftest_alloc(&proc->alloc);
  trace_binder_ioctl(cmd, arg);
  ret = wait_event_interruptible(binder_user_error_wait, binder_stop_on_user_error < 2);
  if (ret)
  goto err_unlocked;
  thread = binder_get_thread(proc);
  if (thread == NULL) {
  ret = -ENOMEM;
  goto err;
  }
  switch (cmd) {
  case BINDER_SET_CONTEXT_MGR:
  ret = binder_ioctl_set_ctx_mgr(filp, NULL);
  if (ret)
    goto err;
  break;
  default:
  ret = -EINVAL;
  goto err;
  }
  ret = 0;
err:
  if (thread)
  thread->looper_need_return = false;
  wait_event_interruptible(binder_user_error_wait, binder_stop_on_user_error < 2);
  if (ret && ret != -EINTR)
  pr_info("%d:%d ioctl %x %lx returned %d\n", proc->pid, current->pid, cmd, arg, ret);
err_unlocked:
  trace_binder_ioctl_done(ret);
  return ret;
}


完整代码参考 https://android.googlesource.com/kernel/common/+/refs/heads/android-mainline/drivers/android/binder.c



2、binder_ioctl_set_ctx_mgr


在 binder_ioctl 方法中调用了 binder_ioctl_set_ctx_mgr 方法 ,


static int binder_ioctl_set_ctx_mgr(struct file *filp,
        struct flat_binder_object *fbo)
{
  int ret = 0;
  // 获取 binder_proc 结构体, 该结构体用于存放 IPC 跨进程请求相关信息 
  // mmap 一次拷贝机制也与该结构体相关 
  struct binder_proc *proc = filp->private_data;
  struct binder_context *context = proc->context;
  // 该 binder_node 相当于 Binder 的实体
  struct binder_node *new_node;
  kuid_t curr_euid = current_euid();
  mutex_lock(&context->context_mgr_node_lock);
  if (context->binder_context_mgr_node) {
  pr_err("BINDER_SET_CONTEXT_MGR already set\n");
  ret = -EBUSY;
  goto out;
  }
  ret = security_binder_set_context_mgr(proc->tsk);
  if (ret < 0)
  goto out;
  if (uid_valid(context->binder_context_mgr_uid)) {
  if (!uid_eq(context->binder_context_mgr_uid, curr_euid)) {
    pr_err("BINDER_SET_CONTEXT_MGR bad uid %d != %d\n",
          from_kuid(&init_user_ns, curr_euid),
          from_kuid(&init_user_ns,
      context->binder_context_mgr_uid));
    ret = -EPERM;
    goto out;
  }
  } else {
  context->binder_context_mgr_uid = curr_euid;
  }
  // 创建 Binder 实体 
  new_node = binder_new_node(proc, fbo);
  if (!new_node) {
  ret = -ENOMEM;
  goto out;
  }
  // 设置 Binder 实体 , 强引用和弱引用次数 + 1
  binder_node_lock(new_node);
  new_node->local_weak_refs++;
  new_node->local_strong_refs++;
  new_node->has_strong_ref = 1;
  new_node->has_weak_ref = 1;
  context->binder_context_mgr_node = new_node;
  binder_node_unlock(new_node);
  binder_put_node(new_node);
out:
  mutex_unlock(&context->context_mgr_node_lock);
  return ret;
}


完整代码参考 https://android.googlesource.com/kernel/common/+/refs/heads/android-mainline/drivers/android/binder.c


目录
相关文章
|
10月前
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
1002 4
|
10月前
|
存储 安全 Android开发
探索Android与iOS的隐私保护机制
在数字化时代,移动设备已成为我们生活的一部分,而隐私安全是用户最为关注的问题之一。本文将深入探讨Android和iOS两大主流操作系统在隐私保护方面的策略和实现方式,分析它们各自的优势和不足,以及如何更好地保护用户的隐私。
|
10月前
|
安全 Android开发 数据安全/隐私保护
深入探讨iOS与Android系统安全性对比分析
在移动操作系统领域,iOS和Android无疑是两大巨头。本文从技术角度出发,对这两个系统的架构、安全机制以及用户隐私保护等方面进行了详细的比较分析。通过深入探讨,我们旨在揭示两个系统在安全性方面的差异,并为用户提供一些实用的安全建议。
|
4月前
|
消息中间件 Android开发
Android Handler的使用方式以及其机制的简单介绍
Handler 是 Android 中实现线程间通信的重要机制,可传递任意两线程数据。常用场景包括子线程向主线程(UI 线程)传递结果,以及主线程向子线程发送消息。其核心涉及四个类:Handler(发送/接收消息)、Message(消息载体)、MessageQueue(消息队列)和 Looper(消息循环泵)。基本流程为:Handler 发送 Message 至 MessageQueue,Looper 从队列中按 FIFO 取出并处理。
161 0
|
11月前
|
消息中间件 存储 Java
Android消息处理机制(Handler+Looper+Message+MessageQueue)
Android消息处理机制(Handler+Looper+Message+MessageQueue)
146 2
|
11月前
|
缓存 Java Shell
Android 系统缓存扫描与清理方法分析
Android 系统缓存从原理探索到实现。
386 15
Android 系统缓存扫描与清理方法分析
|
10月前
|
安全 Android开发 数据安全/隐私保护
深入探索Android与iOS系统安全性的对比分析
在当今数字化时代,移动操作系统的安全已成为用户和开发者共同关注的重点。本文旨在通过比较Android与iOS两大主流操作系统在安全性方面的差异,揭示两者在设计理念、权限管理、应用审核机制等方面的不同之处。我们将探讨这些差异如何影响用户的安全体验以及可能带来的风险。
459 21
|
9月前
|
存储 Linux API
深入探索Android系统架构:从内核到应用层的全面解析
本文旨在为读者提供一份详尽的Android系统架构分析,从底层的Linux内核到顶层的应用程序框架。我们将探讨Android系统的模块化设计、各层之间的交互机制以及它们如何共同协作以支持丰富多样的应用生态。通过本篇文章,开发者和爱好者可以更深入理解Android平台的工作原理,从而优化开发流程和提升应用性能。
|
9月前
|
Java 开发工具 Android开发
安卓与iOS开发环境对比分析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自占据半壁江山。本文深入探讨了这两个平台的开发环境,从编程语言、开发工具到用户界面设计等多个角度进行比较。通过实际案例分析和代码示例,我们旨在为开发者提供一个清晰的指南,帮助他们根据项目需求和个人偏好做出明智的选择。无论你是初涉移动开发领域的新手,还是寻求跨平台解决方案的资深开发者,这篇文章都将为你提供宝贵的信息和启示。
186 8
|
10月前
|
Linux Android开发 iOS开发
深入探索Android与iOS的多任务处理机制
在移动操作系统领域,Android和iOS各有千秋,尤其在多任务处理上展现出不同的设计理念和技术实现。本文将深入剖析两大平台在后台管理、资源分配及用户体验方面的策略差异,揭示它们如何平衡性能与电池寿命,为用户带来流畅而高效的操作体验。通过对比分析,我们不仅能够更好地理解各自系统的工作机制,还能为开发者优化应用提供参考。

热门文章

最新文章