Android 匿名共享内存基础数据结构篇(二)

Android ION 用户空间与内核共享内存 Android 系统中,SurfaceFlinger分配buf 或 CameraService拿到出的图像buf都是通过ION的机制; Android中通过Binder实现 IonFd跨进程共享,IonFd方便应用程序 user space 以及各驱动模块间零拷贝访问buf。 测试用例 项目中使用到的一段代码,部分不完整,但记录下的基本流程以及使用的API还是很清晰的 用户空间 int test::open(){ int rc = -1; mFd = ::open("/dev/test", O_RDWR 阅读详情
Android匿名共享内存系统架构
Android匿名共享内存系统架构图

如上图所示,Android系统匿名共享内存(以下以Ashmem代替)以Ashmem驱动为基础,在运行时库提供了cutils library来对Ashmem驱动进行访问,同时又在Framework层提供了C++和Java类接口来访问cutils。

    这篇文章主要学习kernel层ashmem的基础数据结构,先来看看Ashmem到底是什么!源码版本Android 5

    Ashmem驱动程序主要由ashmem.c和ashmem.h来实现,ashmem.h文件目录:kernel/include/uapi/linux/ashmem.h,ashmem.c文件目录:kernel/drivers/staging/android/ashmem.c,Ashmem驱动程序主要使用了三个结构体:ashmem_area, ashmem_range, ashmem_pin,前两个结构体定义在ashmem.c文件中,ashmem_pin定义在ashmem.h文件中:

结构体ashmem_area用来描述一块Ashmem---->
 

42 /**
 43  * struct ashmem_area - The anonymous shared memory area
 44  * @name:       The optional name in /proc/pid/maps 
 45  * @unpinned_list:  The list of all ashmem areas
 46  * @file:       The shmem-based backing file
 47  * @size:       The size of the mapping, in bytes
 48  * @prot_masks:     The allowed protection bits, as vm_flags
 49  *
 50  * The lifecycle of this structure is from our parent file's open() until
 51  * its release(). It is also protected by 'ashmem_mutex'
 52  *
 53  * Warning: Mappings do NOT pin this structure; It dies on close()
 54  */
 55 struct ashmem_area {
 56     char name[ASHMEM_FULL_NAME_LEN]; /* optional name in /proc/pid/maps */
 57     struct list_head unpinned_list;  /* list of all ashmem areas */
 58     struct file *file;       /* the shmem-based backing file */
 59     size_t size;             /* size of the mapping, in bytes */
 60     unsigned long vm_start;      /* Start address of vm_area
 61                       * which maps this ashmem */
 62     unsigned long prot_mask;     /* allowed prot bits, as vm_flags */
 63 };

name字段解释:

结构体ashmem_area用来描述一块匿名共享内存区域,name用来保存匿名共享内存名称,同时会被写入到文件/proc/<pid>/maps中,<pid>表示创建该Ashmem的进程PID,ASHMEM_FULL_NAME_LEN表示name的长度,定义在文件头部:

38 #define ASHMEM_NAME_PREFIX "dev/ashmem/"
 39 #define ASHMEM_NAME_PREFIX_LEN (sizeof(ASHMEM_NAME_PREFIX) - 1)
 40 #define ASHMEM_FULL_NAME_LEN (ASHMEM_NAME_LEN + ASHMEM_NAME_PREFIX_LEN)

每一块Ashmem名称都是以dev/ashmem/为前缀,如果调用者未指定名称则:#define ASHMEM_NAME_DEF     "dev/ashmem"为其默认名称,如果指定了名称长度限制为:#define ASHMEM_NAME_LEN     256  这两个定义在头文件ashmem.h中。

unpinned_list字段:

该字段用来描述一个解锁内存块列表,一块Ashmem可以被划分为多个小块,当这些小块内存处于解锁状态时,他们会被添加到所属匿名共享内存的解锁内存列表中,主要是为内存管理服务。

file、size字段:

匿名共享内存是基于linux系统的临时文件系统tmpfs来实现的,因此每一块匿名共享内存在临时文件系统tmpfs中都有一个对应的文件,这个文件大小即为匿名共享内存大小即size字段。

vm_start字段:

创建完匿名共享内存临时文件后需要将其映射到进程的地址空间,该字段表示将Ashmem临时文件映射到进程地址空间的起始位置。

prot_mask字段:

描述一块Ashmem的访问保护位,定义如下:ashmem.c

 #define PROT_MASK       (PROT_EXEC | PROT_READ | PROT_WRITE)

结构体ashmem_range用来描述一块处于解锁状态的内存---->

 

65 /**
 66  * struct ashmem_range - A range of unpinned/evictable pages
 67  * @lru:             The entry in the LRU list
 68  * @unpinned:            The entry in its area's unpinned list
 69  * @asma:            The associated anonymous shared memory area.
 70  * @pgstart:             The starting page (inclusive)
 71  * @pgend:           The ending page (inclusive)
 72  * @purged:          The purge status (ASHMEM_NOT or ASHMEM_WAS_PURGED)
 73  *
 74  * The lifecycle of this structure is from unpin to pin.
 75  * It is protected by 'ashmem_mutex'
 76  */
 77 struct ashmem_range {
 78     struct list_head lru;
 79     struct list_head unpinned;
 80     struct ashmem_area *asma;
 81     size_t pgstart;
 82     size_t pgend;
 83     unsigned int purged;
 84 };

处于解锁状态的小块内存都是从一块匿名共享内存中划分出来的,他们通过unpinned成员变量链入宿主匿名共享内存的解锁内存列表unpinned_list中。一块处于解锁状态的内存宿主匿名共享内存是通过成员变量asma来描述的。

在Ashmem中,每一块处于解锁状态的内存都会通过成员变量lru链入到一个全局列表ashmem_lru_list中,这是个最近最少使用列表,定义如下:

/* LRU list of unpinned pages, protected by ashmem_mutex */
  static LIST_HEAD(ashmem_lru_list);

处于解锁状态的内存都是目前不在需要使用的内存块,当系统内存不足的时候内存管理系统就会按照规则回收ashmem_lru_list中的内存块,成员变量pgstart和pgend用来描述这块处于解锁状态的内存块的起始地址和结束地址,单位是page(页)。

成员变量purged用来描述一块处于解锁状态的内存块是否已经被回收,他的值定义在头文件ashmem.h中:

 

12 /* Return values from ASHMEM_PIN: Was the mapping purged while unpinned? */
 13 #define ASHMEM_NOT_PURGED   0     未被回收
 14 #define ASHMEM_WAS_PURGED   1     已被回收

结构体ashmem_pin用来描述一块即将被锁定或者解锁的内存--->
 

 20 struct ashmem_pin {
 21     __u32 offset;   /* offset into region, in bytes, page-aligned */
 22     __u32 len;  /* length forward from offset, in bytes, page-aligned */
 23 };

offset表示描述的这块内存在其宿主匿名共享内存中的偏移值,len表示要被锁定或者解锁的内存块的大小,以字节为单位,并且对齐到页面边界的。

这三个结构体共同描述了一块Ashmem的多个状态,ashmem_area结构体即一块匿名共享内存的本体,即 告诉我们这块内存到底是什么。结构体ashmem_range描述Ashmem的解锁状态记录,提供内存管理相关便利。而ashmem_pin主要是一小块内存在被锁定或者解锁的过程中使用。

 

安卓入门一 Java基础 一、团队效率提升 版本更新 Android增量更新与热修复 增量更新的目的是为了减少更新app所需要下载的包体积大小,常见如手机端游戏,apk包体积为几百M,但有时更新只需下载十几M的安装包即可完成更新。 增量更新demo地址:https://github.com/po1arbear/bsdiff-android 热修复一般是用于当已经发布的app有Bug需要修复的时候,开发者修改代码并发布补丁,让应用能够在不需要重新安装的情况下实现更新,主流方案有Tinker、AndFix等。 管理软件更新 阅读详情

相关推荐

注册“Oracle Provider for OLE DB”和创建链接服务器

注册“Oracle Provider for OLE DB”和创建链接服务器 在sql server 数据库上创建链接服务器,连接oracle数据库,访问接口需要设置为:“Oracle Provider for OLE DB”。 如果电脑上没有这个驱动,安装一个完整的Oracle11gR2程序是一个有效的方法,但这个64位版本的安装包有2个多G, 相当庞大,如果仅仅...

weixin_30760895的博客 2383

Android笔记--共享内存

这一节了解一下共享内存,Android系统实现了一个匿名共享内存,用来在应用

ljt2724960661的博客 2172

AP发票批量付款程序(WEB ADI)

CREATE OR REPLACE PACKAGE MEW_AP_BATCH_PAYMENTS_PKG IS   PROCEDURE MAIN(P_BATCH_ID          NUMBER                 ,P_ORG_ID            NUMBER                 ,P_BANK_ACCOUNT_NAME VARCHAR2

储藏室 5050

深入理解共享内存

Binder驱动通过当前进程的fd找到对应的文件,然后为目标进程创建新的fd,并传递给目标进程,来看下Android中binder的实现(以下代码非android13)注释1上面的英文注释写的很清楚,此方法会根据传过来的FileDescriptor创建个新的重复的FileDescriptor,这两个FileDescriptor共享同样的文件状态,即指向的是同一个文件,后面再通过binder通信把新创建的FileDescriptor的包装类ParcelFileDescriptor传到其他进程。

qq_15915161的博客 1517

ESP32-S3开发板实战:5分钟搞定智能门铃的音视频通话功能(附源码)

本文详细介绍了如何利用乐鑫ESP32-S3开发板快速实现智能门铃的实时音视频通话功能。通过ESP-ADF框架和RTC服务,开发者可在五分钟内完成环境搭建与核心功能调试,并附有源码和关键配置详解,为嵌入式音视频应用开发提供了高效实践路径。

web99的专栏 527

手把手教你用AFL挖掘C程序漏洞:从安装到实战(附常见错误排查)

本文详细介绍了如何使用American Fuzzy Lop (AFL)对C/C++程序进行模糊测试,从环境准备、目标程序插桩编译、初始语料库构建到实战运行与结果分析。重点讲解了AFL的安装、常见错误排查(如核心转储配置、执行速度优化)以及提升测试效率的高级策略(如持久模式、并行化),帮助开发者和安全工程师高效挖掘程序漏洞。

weixin_29014237的博客 407

Android12 简单的共享内存驱动实现 参考Ashmem

Android12 共享内存驱动实现 参考Ashmem

yinsui1839的博客 1189

从零搭建宝兰德BES单机版:分离式安装、环境变量配置到控制台访问的避坑指南

本文详细介绍了从零搭建宝兰德BES单机版的完整流程,包括分离式安装、环境变量配置和控制台访问的避坑指南。针对中间件安装部署中的常见问题,提供了账号规划、JDK配置、实例创建和防火墙设置等实用解决方案,帮助开发者和运维人员高效完成BES中间件的部署工作。

weixin_32576389的博客 371

Android内核源码阅读---ashmem.c

<br />ashmem的意思就是Anonymous Shared Memory,即匿名共享内存。Android系统主要包括五个部分,分别是Linux 内核、本地库、Dalvik 虚拟机、应用程序框架和应用程序。对于其中的Linux内核部分,最初Android是基于2.6.25的,而且Android内核基本是同Linux内核同步更新的,Android在Linux内核的基础上做了一些修改和功能上的添加。目前最新的开源版本是Android2.3,它是基于Linux-2.6.35的,它于2010年12月7日公布。

Mr.Right 3409

西门子S7-200SMART控制步进电机(五)

前面详细讲述了运动控制向导的配置和运动控制指令的使用方法,接下来要讲的是简单程序的编写和调试。 在编写程序时,需要注意的是自定义的符号和地址不能与运动控制向导分配的存储器冲突。 一、软硬件组成 1、软件:STEP-7-Micro/WIN SMART软件; 2、硬件:西门子S7-200 SMART ST40 PLC、57步进电机和驱动器(DM542)。 二、手动控制步进电机旋转方向和速度 具体步骤...

qq_43134642的博客 2万+

Simulink实战:5步搞定固定翼飞行器六自由度动力学建模(附模型下载)

本文提供了一份详细的Simulink实战指南,通过5个核心步骤手把手教你构建固定翼飞行器的六自由度动力学模型。内容涵盖从顶层架构设计、核心方程手动实现,到模型集成、测试调试及进阶优化的完整流程,旨在帮助航空航天学生和工程师将抽象理论转化为可运行的仿真模型,并附有模型下载。

perl8的博客 634

Android系统匿名共享内存Ashmem(Anonymous Shared Memory)在进程间共享的原理分析

在前面一篇文章Android系统匿名共享内存Ashmem(Anonymous Shared Memory)驱动程序源代码分析中,我们系统地介绍了Android系统匿名共享内存的实现原理,其中着重介绍了它是如何辅助内存管理系统来有效地管理内存的,在再前面一篇文章Android系统匿名共享内存Ashmem(Anonymous Shared Memory)简要介绍和学习计划中,我们还提到,Android

老罗的Android之旅 5万+

哨兵1号后向散射系数土壤水分反演

打开之前预处理之后的VH和VV极化的后向散射系数转存的tiff文件。

所有专家都曾始于新手 3292

linux匿名共享内存,Ashmem匿名共享内存驱动

匿名共享内存匿名共享内存的实现是已Ashmem驱动程序为基础所构建起来的一套方案,基于linux的临时文件系统tmpfs.ashmem系统大概分成三层,如下: 最下方的是kernel层,也就是我们即将介绍的ashmem驱动程序,在启动时它会创建一个/dev/ashmem的设备文件。而上层的cutils库就通过文件访问操作open,ioctl来访问驱动程序。另外cutils主要提供了三个函数ashm...

weixin_42510645的博客 887

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Ashmen 匿名共享内存

ashmem的意思就是Anonymous Shared Memory,即匿名共享内存。Android系统主要包括五个部分,分别是Linux 内核、本地库、Dalvik 虚拟机、应用程序框架和应用程序。对于其中的Linux内核部分,最初Android是基于2.6.25的,而且Android内核基本是同Linux内核同步更新的,Android在Linux内核的基础上做了一些修改和功能上的添加。目前最新

kenall的部落格 1208

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Android开发之五:Ashmem匿名共享内存驱动

匿名共享内存 匿名共享内存的实现是已Ashmem驱动程序为基础所构建起来的一套方案,基于linux的临时文件系统tmpfs. ashmem系统大概分成三层,如下: 最下方的是kernel层,也就是我们即将介绍的ashmem驱动程序,在启动时它会创建一个/dev/ashmem的设备文件。 而上层的cutils库就通过文件访问操作open,ioctl来访问驱...

随意的风的专栏 923

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Android系统的Ashmem匿名共享内存子系统分析(1)- Ashmem驱动

Android系统中提供了独特的匿名共享内存子系统Ashmem (Anonymous Shared Memory),它以驱动程序的形式实现在内核空间中。能够辅助内存管理系统来有效地管理不再使用的内存块。通过 Binder进程间通信机制来实现进程间的内存共享。对于 Android 系统的匿名共享内存子系统来说,其主体是以驱动程序的形式实现在内核空间的,同时,在系统 Native 层提供了 C/C++ 调用接口和 Framework 层提供了 Java 调用接口。

Android系统工程师--小馬佩德罗 764

Android 匿名共享内存驱动源码分析

Android系统的匿名共享内存Ashmem驱动程序利用了Linux的共享内存子系统导出的接口来实现,本文通过源码分析方式详细介绍Android系统的匿名共享内存机制。在Android系统中,匿名共享内存也是进程间通信方式的一种。相比于malloc和anonymous/named mmap等传统的内存分配机制,Ashmem的优势是通过内核驱动提供了辅助内核的内存回收算法机制(pin/unpin)。

深入剖析Android系统 5918

Android 渲染机制——SurfaceFlinger

SurfaceFlinger Android 图形架构使用了生产者——消费者模型。Surface 表示缓冲队列中的生产方,图像流最常见的消耗方是 SurfaceFlinger,该系统服务接收来自于多个源的数据缓冲区,组合它们,并将它们发送给显示设备。 Android 应用程序为了能够将自己的 UI 绘制在系统的帧缓冲区上,它们就必须要与 SurfaceFlinger 服务进行通信。SurfaceFlinger 服务运行在 Android 系统的 System 进程中,它负责管理 Android 系统的帧缓

卜大爷的博客 3万+

《老罗的Android之旅》阅读笔记——匿名共享内存

匿名共享内存子系统Ashmem(Anonymous Shared Memory),以驱动程序的形式实现在内核空间中。有两个特点: 一是能够辅助内存管理系统来有效地管理不再使用的内存块、 二是它通过Binder进程间通信机制来实现进程间的内存共享。 *.文件描述符其实就是一个整数,它是用来索引进程保存在内核空间的打开文件数据结构的,而且,这个文件描述符只是在进程内有效。

WYYZ5的专栏 1049

Anonymous Shared Memory android 匿名共享内存

原址 两个特点: 能够辅助内存管理系统来有效的管理不再使用的内存块 通过Binder进程间通信机制来实现进程间的内存共享。 Android系统的匿名共享内存子系统的主体是以驱动程序的形式实现在内核空间的。 应用程序框架层的Java调用接口是通过JNI方法来调用库层的C/C++调用接口 android应用程序框架层提供了一个MemoryFile接口来封装了匿名共享内存

Android系统攻城狮 1308
上一篇: windows 下载aosp
下一篇: Android 匿名共享内存初始化篇(三)
杨鑫校
博客等级 码龄11年 24粉丝 113原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值