binder android

文心一言的回答

Binder驱动是Android操作系统中用于进程间通信(IPC)的机制。它提供了一种高效、跨进程的数据传输方式,使得应用程序的不同组件可以在Android系统上互相通信

Binder驱动基于Linux内核,其核心组件是一个称为Binder IPC的通信协议。通过使用Binder IPC,应用程序的不同组件可以共享数据、资源和功能,从而实现更高效的应用程序运行。

Binder驱动的主要特点是高效、安全和灵活。它支持跨进程通信,使得应用程序的不同组件可以协同工作,从而提高了应用程序的效率和性能。同时,Binder驱动还提供了一系列的机制和安全措施,以确保数据传输的安全性和完整性。

在Android系统中,Binder驱动的实现主要依赖于Linux内核提供的机制和功能。它利用Linux内核提供的虚拟文件系统、进程间通信(IPC)机制和内存管理功能,实现了高效、可靠和安全的跨进程通信。

总之,Binder驱动是Android操作系统中用于实现跨进程通信的重要机制之一,它提供了高效、安全和灵活的通信方式,使得应用程序的不同组件可以协同工作,提高了应用程序的效率和性能。

那binder到底是个啥呢

Binder驱动相关的一些重要结构体

6~9 用于数据传输相关,其中binder_write_read,binder_transaction_data进程空间和内核空间是通用的

/

Binder驱动是Android专用的,但底层的驱动架构与Linux驱动一样。binder驱动在以misc设备进行注册,作为虚拟字符设备,没有直接操作硬件,只是对设备内存的处理。主要是驱动设备的初始化(binder_init),打开 (binder_open),映射(binder_mmap),数据操作(binder_ioctl)

系统调用

用户态的程序调用Kernel层驱动是需要陷入内核态,进行系统调用(syscall),比如打开Binder驱动方法的调用链为: open-> __open() -> binder_open()。 open()为用户空间的方法,__open()便是系统调用中相应的处理方法,通过查找,对应调用到内核binder驱动的binder_open()方法,至于其他的从用户态陷入内核态的流程也基本一致。

系统调用是操作系统提供给应用程序的一种接口,使得应用程序可以使用操作系统的功能。通过系统调用,应用程序可以请求操作系统的服务,例如文件管理、进程控制、内存管理等。系统调用是应用程序与操作系统内核之间的接口,它使得应用程序可以在用户空间和内核空间之间进行通信。

相关代码位置

内核主要是通过initcall机制,在启动init进程的时候,完成对binder_init()的调用

// debugfs_create_dir是指在debugfs文件系统中创建一个目录,返回值是指向dentry的指针。当kernel中禁用debugfs的话,返回值是-%ENODEV。默认是禁用的。如果需要打开,在目录/kernel/arch/arm64/configs/下找到目标defconfig文件中添加一行CONFIG_DEBUG_FS=y,再重新编译版本,即可打开debug_fs。

//在debugfs文件系统(/sys/kernel/debug/)中创建一系列的文件

//创建几个文件: // /sys/kernel/debug/binder/state // /sys/kernel/debug/binder/stats // /sys/kernel/debug/binder/transactions // /sys/kernel/debug/binder/transaction_log // /sys/kernel/debug/binder/failed_transaction_log

  • /sys/kernel/debug/binder/state:整体以及各个进程的thread/node/ref/buffer的状态信息,如有deadnode也会打印

  • /sys/kernel/debug/binder/stats:整体以及各个进程的线程数,事务个数等的统计信息

  • /sys/kernel/debug/binder/failed_transaction_log:记录32条最近的传输失败事件

  • /sys/kernel/debug/binder/transaction_log:记录32条最近的传输事件

  • /sys/kernel/debug/binder/transactions:遍历所有进程的buffer分配情况

  • proc目录中都是进程号,观察其中的进程都是注册在驱动的进程,其中包括servicemanager。可以通过命令cat /sys/kernel/debug/binder/proc/进程号查看对应进程的binder信息。

这只有进程号,谁知道哪是哪啊

  • misc设备:Linux内核把无法归类的设备定义为misc设备,譬如看门狗、实时时钟等。Linux内核把所有的misc设备组织在一起,构成一个子系统,进行统一管理。在这个子系统里的所有misc类型的设备共享一个主设备号MISC_MAJOR(10),但它们次设备号不同

  • 结构体binder_device表示一个binder设备节点,记录了该节点相关信息。

  • binder_device->miscdev:即结构体miscdevice。它表示一个misc设备,记录该设备的名称、次设备号、支持的系统调用操作等。

  • binder_device->miscdev.fops = &binder_fops;

fops即file_operations结构体,这个结构的每一个成员都对应着一个系统调用,Linux系统调用通过调用file_operations中相应的函数指针,接着把控制权转交给函数,从而完成Linux设备驱动程序的工作

当binder驱动执行系统调用时,即用户态像内核态的陷入

  1. 如果是系统调用ioctl(),最终会调用binder_ioctl()

  2. 如果是系统调用mmap(),最终会调用binder_map()

  3. 如果是系统调用open(),最终会调用binder_open()

binder文件系统——init_binderfs()

// 向VFS注册binder文件系统

int __init init_binderfs(void)

ret = register_filesystem(&binder_fs_type);

每个注册的文件系统都用一个类型为file_system_type的结构体表示。file_system_type主要记录文件系统的类型相关信息,比如名称、上下文初始化函数指针等binder_fs_type指明将要挂载的Binder文件系统名为binder

看来socket也整了一个文件系统?

顺便带一下linux文件系统

详见参考链接

Binder文件系统挂载到VFS的时机在init进程启动的时候。相关挂载指令在system/core/rootdir/init.rc中

# Mount binderfs

mkdir /dev/binderfs

# 将代表Binder驱动的路径/dev/binderfs挂载到Binder文件系统。

mount binder binder /dev/binderfs stats=global

chmod 0755 /dev/binderfs # 为相应的文件路径起别名。如/dev/binderfs/binder对应别名就是/dev/binder

symlink /dev/binderfs/binder /dev/binder symlink /dev/binderfs/hwbinder /dev/hwbinder symlink /dev/binderfs/vndbinder /dev/vndbinder

chmod 0666 /dev/binderfs/hwbinder chmod 0666 /dev/binderfs/binder chmod 0666 /dev/binderfs/vndbinder

还能这么玩儿

binderfs_binder_device_create()中,inode->i_fop = &binder_fops。binder_fops是结构体file_operations的对象,它记录着一些函数指针,代表Binder文件系统支持的系统调用的最终实现

Framework层

每个要使用 Binder 进行通信的进程,都会调用 Framework 层的 ProcessState::initWithDriver() ,打开 Binder 驱动。initWithDriver() 主要涉及了几个系统调用,它们的具体的实现,主要是在内核层

mmap():进行 mmap 映射,提供一块虚拟地址空间,用于建立接收其他进程事务消息的缓冲区。最终会调用 Binder 驱动的 binder_mmap()

这几个系统调用,最终都是通过虚拟文件系统,进入到内核层

binder_open

在打开Binder设备时,初始化并添加一个binder_proc结构体到全局链表中,并创建相关的debugfs文件和binderfs文件

创建binder_proc对象,并把当前进程等信息保存到binder_proc对象,该对象管理IPC所需的各种信息并拥有其他结构体的根结构体;再把binder_proc对象保存到文件指针filp,以及把binder_proc加入到全局链表binder_procs

Binder驱动中通过static HLIST_HEAD(binder_procs);,创建了全局的哈希链表binder_procs,用于保存所有的binder_proc队列,每次新创建的binder_proc对象都会加入binder_procs链表中。

在当前进程在用户空间开辟了1M-8k的内存空间,但是这些Binder线程会同时共享这部分空间,都通过这部分空间来和Binder驱动进行传递数据。那么所以对于单个Binder线程能够传递的数据不会超过1M-8k

Binder_mmap

Binder_mmap实现:

vma表示应用进程的虚拟地址空间。

通过mmap()机制让vma与某块物理页内存进行了映射。

同时让binder驱动内核的虚拟地址空间binder_proc->buffer与应用进程的虚拟内存大小一致

让该物理页驱动的虚拟内存空间进行映射。

至此,应用进程就和驱动内核映射了同一块物理空间,应用进程可直接进行访问,而不用拷贝

Binder 的内存管理,指的就是管理 mmap 映射的这块缓冲区。Binder 驱动为这块缓冲区,设计了复杂的数据结构,实现了高效查询、分

每个使用 Binder 通信的 Android 进程,都会事先建立一个缓冲区。它用 binder_alloc 来管理。

binder_alloc 的部分定义如下

Binder 驱动用 binder_buffer 来描述缓冲区。但由于字节对齐,缓冲区的大小可能会比这三个字段的总和稍大一点。Binder 驱动利用 buffers 链表,采用了比较巧妙的方式计算一个 binder_buffer 的大小。Binder 驱动其实一开始是不会为缓冲区分配对应的物理内存的,只是先分配了一段用户空间的虚拟地址,即只是先分配了虚拟内存。

在处理事务的时候,会从缓冲区划分一块 binder_buffer 出来处理事务。这时候,才会为这块小缓冲区分配物理内存。

缓冲区分配的代码主要在 binder_alloc_new_buf_locked() 中

binder_buffer1 释放后,由于 binder_buffer1 的前后都是空闲的 buffer,会进行合并,即 binder_buffer0、binder_buffer1 和 binder_buffer2 合并,只剩 binder_buffer0。

② buffers 链表处理:

  • 发现 binder_buffer1 不是尾节点,并且后续节点 binder_binder2 是空闲的,直接移除 binder_buffer2 节点。

  • 发现 binder_buffer1 不是头节点,并且前驱节点 binder_binder0 是空闲的,这时候,移除的不是 binder_binder0,而是 binder_buffer1 节点。

③ 在处理 buffers 链表的时候,会同步更新 free_buffers 红黑树,所以最终 free_buffers 红黑树只剩 binder_buffer0 节点。

④ 从 allocated_buffers 红黑树中移除 binder_buffer1。

分配、释放一个 binder_buffer 的物理内存页

分配、释放一个 binder_buffer 的物理内存页,都是在 binder_update_page_range() 里进行的:

链表结构体

binder_ioctl

ioctl是Linux中常见的系统调用,它用于对底层设备的一些特性进行控制的用户态接口,应用程序在调用ioctl进行设备控制时,最后会调用到设备注册struct file_operations结构体对象的unlocked_ioctl或者compat_ioctl(32位的应用运行在64位的内核上,这个钩子被调用)两个钩子上。在Binder驱动的struct file_operations定义中可见,它的unlocked_ioctl钩子的的实现都是对应到binder_ioctl上的。

ioctl是Linux中常见的系统调用,它用于对底层设备的一些特性进行控制的用户态接口,应用程序在调用ioctl进行设备控制时,最后会调用到设备注册struct file_operations结构体对象的unlocked_ioctl或者compat_ioctl(32位的应用运行在64位的内核上,这个钩子被调用)两个钩子上。在Binder驱动的struct file_operations定义中可见,它的unlocked_ioctl钩子的的实现都是对应到binder_ioctl上的。

参考链接

你真的知道什么是系统调用吗?这篇让你把它玩转起来 - 知乎

Binder系列1—Binder Driver初探 - Gityuan博客 | 袁辉辉的技术博客

图解 Binder:内存管理 - 掘金

Binder Driver 5: binder_buffer 管理 - 简书

深入浅出文件系统(二)文件系统对象_file_system_type-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/663024.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于最新koa的Node.js后端API架构与MVC模式

Koa 是一个由 Express 原班人马打造的现代 Web 框架,用于 Node.js。它旨在提供一个更小、更富有表现力和更强大的基础,用于 Web 应用和 API 开发。Koa 不捆绑任何中间件,它提供了一个优雅的方法以组合不同的中间件来处理请求和响应。 Koa 的核…

2024年哪款便签软件是手机电脑同步的?

在繁忙的生活、工作和学习中,我们时常面临各种琐事和任务,需要随时记录、提醒,以保持高效的生活节奏。比如,突然想到的灵感、重要的工作计划、紧急的购物清单,都需要一个便利的便签工具来随手记录。特别是在多终端使用…

vue2 el-form 两个时间框(第一个时间框是只能选择当前时间,之前的是不允许选择,第二个时间框是第一个时间的当前的时间后30天后可以选择的)

<template><div id"app"><el-form :model"form"><el-form-item label"预签时间"><el-date-picker v-model"form.t2" type"date" placeholder"选择预签时间" changepreSigning/><…

RT-DETR算法优化改进:上采样算子 | 超轻量高效动态上采样DySample,效果秒杀CAFFE,助力小目标检测

💡💡💡本文独家改进:一种超轻量高效动态上采样DySample, 具有更少的参数、FLOPs,效果秒杀CAFFE和YOLOv8网络中的nn.Upsample 💡💡💡在多个数据集下验证能够涨点,尤其在小目标检测领域涨点显著。 RT-DETR魔术师专栏介绍: https://blog.csdn.net/m0_63774211/…

C++ 音视频流媒体浅谈

C流媒体开发 今天就浅浅聊一下C流媒体开发 流媒体开发中最常见的是FFmpeg&#xff08;编解码器&#xff09; 业务逻辑主要是播放器了&#xff08;如腾旭视频 爱奇艺等等&#xff09; FFmpeg是一个开源的音视频处理工具集&#xff0c;可以用于处理、转换和流媒体传输音视频…

广州标点医药信息-米内网数据及咨询服务企业全方位解析!

米内网&#xff08;MENET&#xff09;原名中国医药经济信息网&#xff0c;由广州标点医药信息股份有限公司主办&#xff0c;2010年10月28日更名为“米内网”&#xff0c;上线初始主打医药销售数据库&#xff0c;经过十余年的迭代发展&#xff0c;现已成为国内主要的医药健康信息…

计网——应用层

应用层 应用层协议原理 网络应用的体系结构 客户-服务器&#xff08;C/S&#xff09;体系结构 对等体&#xff08;P2P&#xff09;体系结构 C/S和P2P体系结构的混合体 客户-服务器&#xff08;C/S&#xff09;体系结构 服务器 服务器是一台一直运行的主机&#xff0c;需…

数据结构·复杂度讲解

1. 什么是数据结构 数据结构(Data Structure)是计算机存储、组织数据的方式&#xff0c;指相互之间存在一种或多种特定关系的数据元素的集合。 数据结构是用来在内存中管理数据的&#xff0c;类似的&#xff0c;我们熟悉的文件或数据库是在硬盘中管理数据的。内存中的数据是带点…

【2024美赛】B题(中英文):搜寻潜水器Problem B: Searching for Submersibles

【2024美赛】B题&#xff08;中英文&#xff09;&#xff1a;搜寻潜水器Problem B: Searching for Submersibles 写在最前面2024美赛翻译 —— 跳转链接 中文赛题问题B&#xff1a;搜寻潜水器你的任务是&#xff1a; 词汇表 英文赛题Problem B: Searching for SubmersiblesYour…

基于VMware和Unbuntu18.04编译 嘉立创·泰山派 Linux SDK

主机硬件要求 内存最少32G 硬盘腾出200-500G&#xff0c;虽然编译最终占了73G&#xff0c;但富余一些以后可以搞别的方便 操作系统win7/10/11 VMware 安装 1.去vmware官网下载&#xff1a;https://customerconnect.vmware.com/cn/downloads/info/slug/desktop_end_user_comp…

小红书种草商品笔记违规,有哪些原因?

发布小红书笔记之后迟迟没有流量&#xff0c;内容过关但是浏览量突然变低是什么原因?如果出现上述情况&#xff0c;就可能是商品笔记被限制了。那么该如何重新获得流量呢?今天我们就来分享下小红书种草商品笔记违规&#xff0c;有哪些原因&#xff1f; 一、怎样判断被限流了 …

网络原理-TCP/IP(4)

TCP原理 滑动窗口 之前我们讲过了确认应答策略,对发送的每一个数据段,都要给一个ACK确认应答,收到ACK后再发送下一个数据段. 确认应答,超时重传,连接管理这样的特性都是为了保证可靠运输,但就是付出了传输效率(单位时间能传输数据的多少)的代价,因为确认应答机制导致了时间大…

Qt实现类似ToDesk顶层窗口 不规则按钮

先看效果&#xff1a; 在进行多进程开发时&#xff0c;可能会遇到需要进行全局弹窗的需求。 因为平时会使用ToDesk进行远程桌面控制&#xff0c;在电脑被控时&#xff0c;ToDesk会在右下角进行一个顶层窗口的提示&#xff0c;效果如下&#xff1a; 其实要实现顶层窗口&#xf…

计算机设计大赛 深度学习 python opencv 火焰检测识别

文章目录 0 前言1 基于YOLO的火焰检测与识别2 课题背景3 卷积神经网络3.1 卷积层3.2 池化层3.3 激活函数&#xff1a;3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 YOLOV54.1 网络架构图4.2 输入端4.3 基准网络4.4 Neck网络4.5 Head输出层 5 数据集准备5.1 数…

力扣hot100 对称二叉树 递归

Problem: 101. 对称二叉树 文章目录 思路Code 思路 &#x1f468;‍&#x1f3eb; 参考 Code 时间复杂度: O ( n ) O(n) O(n) 空间复杂度: O ( n ) O(n) O(n) /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* …

深入解剖指针篇(3)

个人主页&#xff08;找往期文章&#xff09; &#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 目录 二级指针 指针数组 指针数组模拟二维数组 字符指针变量 数组指针 数组指针初始化 二维数组传参的本质 函数指针 函数指针的使用 typedef关键字 函数指针数组 二级指针…

缓存击穿,商详页进不去了!!!

故事 对于小猫来讲&#xff0c;最近的一段日子是不好过的&#xff0c;纵使听着再有节拍的音乐&#xff0c;也换不起他对生活的热情。由于上一次“幂等事件”躺枪&#xff0c;他已经有几天没有休息好了。他感觉人生到了低谷。 当接手这个商城项目之后&#xff0c;他感觉他一直没…

视频怎么加水印?分享两个简单的加水印的方法

在数字媒体时代&#xff0c;视频已经成为信息传播的重要方式。许多人在创作视频是会加上自己独特的水印&#xff0c;防止视频被盗用。水印作为数字版权保护技术的一种&#xff0c;可以有效地防止视频被非法复制、传播或篡改&#xff0c;从而保护创作者的权益和利益。下面我分享…

关闭idea之后,项目还在运行,端口被占用

今天在写项目的时候&#xff0c;中途安装了一个插件&#xff0c;而且插件显示需要重启idea&#xff0c;重启的时候项目正在运行&#xff0c;重启之后发现idea没有显示有项目正在运行&#xff0c;当我要开启项目的时候&#xff0c;发现无法开启&#xff0c;显示端口被占用了&…

【leetcode题解C++】654.最大二叉树 and 617.合并二叉树

654. 最大二叉树 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中的最大值。递归地在最大值 左边 的 子数组前缀上 构建左子树。递归地在最大值 右边 的 子数组后缀上 构建右子树。 返回 nums …