`
isiqi
  • 浏览: 16649386 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

Android ashmem的实现方式

阅读更多
ashmem是android的内存分配/共享机制,在dev目录下对应的设备是/dev/ashmem,相比于传统的内存分配机制,如malloc、anonymous/named mmap,其好处是提供了辅助内核内存回收算法的pin/unpin机制。 ashmme的典型用法是先打开设备文件,然后做mmap映射。 第一步通过调用ashmem_create_region函数,这个函数完成这几件事: 1)fd = open("/dev/ashmem", O_RDWR); 2)ioctl(fd, ASHMEM_SET_NAME, region_name); // 这一步可选 3)ioctl(fd, ASHMEM_SET_SIZE, region_size); 第二步,应用程序一般会调用mmap来把ashmem分配的空间映射到进程空间: mapAddr = mmap(NULL, pHdr->mapLength, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0); 应用程序还可以通过ioctl来pin和unpin某一段映射的空间,以提示内核的page cache算法可以把哪些页面回收,这是一般mmap做不到的。 可以说ashmem以较小的代价(用户需进行额外的ioctl调用来设置名字,大小,pin和unpin),获得了一些内存使用的智能性。 ashmem本身实现也很小巧,只有不到700行。原因是借助了内核已经有的工具,例如shmem_file_setup(支撑文件),cache_shrinker(slab分配算法的页面回收的回调函数)等。 如果ashmem不使用内核驱动实现,则pin/unpin的语义比较难以实现,或者即使实现,效率也不会很高。但查询android源码,使用pin/unpin很少,看来ashmem还是没有很好地用起来。 如果不使用ashmem驱动,并且舍弃pin/unpin语义,那么模拟ashmem的语义还是很简单的。首先,ashmem_create_region可以为进程创建一个唯一的文件(如进程名+时戳),打开,然后返回这个文件的fd;接着应用程序可以进性一般的mmap操作了。如果不使用ashmem_create_region接口函数,那么使用anonymous的mmap就可以了,但这种方式属于正在被丢弃的方式,而且并不是所有的系统都支持,比如Macos就不支持。
分享到:
评论

相关推荐

    android Pmem 和ashmem 介绍

    Android中的Pmem(Persistent Memory)和Ashmem(Anonymous Shared Memory)是两种用于进程间通信(IPC)和数据共享的技术,它们都是基于mmap系统调用来实现的。mmap允许不同的进程将同一段物理内存映射到各自的虚拟...

    android进程间socket传递Ashmem的文件描述符

    这样,一个进程创建的Ashmem内存区域,可以通过IPC的方式将文件描述符传递给其他进程,从而实现跨进程的数据共享。 在Android中,通常使用Binder机制来执行IPC,但当涉及到大文件或大量数据传输时,Binder可能效率...

    ashmem C case

    在Android系统中,ashmem是通过Linux内核的一个扩展实现的,使得开发者可以创建和管理与硬件无关的共享内存区域。 在"ashmem C case"中,我们关注的是如何在C或C++层面上使用ashmem。在Android系统中,通常会涉及到...

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

    在Android中,Ashmem通常与Binder IPC机制结合使用,以实现进程间的内存共享。 首先,理解Binder IPC机制是关键。Binder是Android系统的核心组件之一,它提供了一种安全、高效的进程间通信方式。Binder对象是Binder...

    Android底层驱动开发.pdf

    Ashmem机制通过/dev/ashmem设备文件实现,相关代码分布在include/linux/ashmem.h和drivers/staging/android/ashmem.c文件中。 接着,Android Logger提供了日志管理服务,它允许应用程序记录日志信息。Logger服务...

    Android技术内幕.系统卷(扫描版)

    4.4 android电源管理机制的实现 /154 4.5 小结 /187 第5章 驱动的工作原理及实现机制 /188 5.1 显示驱动(framebuffer)/189 5.1.1 framebuffer的工作原理 /189 5.1.2 framebuffer的构架 /190 5.1.3 framebuffer驱动...

    Android专用驱动

    这个PPT讲Logger、Binder和Ashmem三个Android专用驱动的实现原理。由于这三个驱动在Android源代码里面用得非常广泛和频繁,因此理解它们的实现原理,就可以掌握Android的精华。这对以后阅读Android系统的其它代码,...

    libandroid-shmem:使用Ashmem在Android上进行System V共享内存仿真

    libandroid-shmem 在使用ashmem在Android上进行System V共享内存(shmget,shmat,shmdt和shmctl)仿真。 它创建的共享内存段将在创建过程销毁它们或死时自动销毁,这与System V共享内存行为不同。 基于先前工作。...

    Android binder C++ service/client 实现. 共享内存

    在Android系统中,Binder是进程间通信...总结,使用C++实现Android Binder服务和客户端,结合共享内存,能实现高效、低延迟的进程间通信。理解并熟练运用这些技术,对于开发高效能的Android系统级应用或服务至关重要。

    Android系统源代码情景分析 / 罗升阳著

    Android专用驱动系统篇介绍了Logger日志驱动程序、Binder进程间通信驱动程序以及Ashmem匿名共享内存驱动程序;Android应用程序框架篇从组件、进程、消息以及安装四个维度对Android应用程序的框架进行了深入的剖析。...

    android系统原理及开发要点详解

     5.3.1 JNI的架构和实现方式 97  5.3.2 JNI的实现方式 97  5.3.3 在应用程序中使用JNI 99  5.4 系统服务的Java部分 101  5.4.1 Binder 102  5.4.2 ServiceManager 103  5.4.3 系统进程 103  第6章 Android的...

    Android技术内幕.系统卷 pdf

    4.4 android电源管理机制的实现 /154 4.5 小结 /187 第5章 驱动的工作原理及实现机制 /188 5.1 显示驱动(framebuffer)/189 5.1.1 framebuffer的工作原理 /189 5.1.2 framebuffer的构架 /190 5.1.3 ...

    Android 基于共享内存实现 Camera 跨进程大数据的高效传输.zip

    本资料“Android 基于共享内存实现 Camera 跨进程大数据的高效传输.zip”提供了一个示例项目“camera-ipc-sample-master”,用于探讨如何实现这一目标。 共享内存是一种有效的进程间通信(IPC,Inter-Process ...

    Android系统架构概述PPT

    Android系统使用的Linux内核包含了一些专用驱动,例如Logger、Binder、Ashmem、Wakelock、Low-Memory Killer和Alarm等,这些Android专用驱动构成了Android运行时的基石。Android运行时从下到上又包括了HAL层、应用...

    android中java和C的socket通信demo

    本教程将详细解释如何在Android中实现Java和C的Socket通信,特别是在涉及文件描述符传递的场景下。 1. **Java Socket基础** Java中的`java.net.Socket`类提供了网络通信的能力,它允许我们在两个应用程序之间建立...

    android多进程通信二

    Android提供了MemoryFile类,它基于 ashmem(Android共享内存)机制,可用于在进程间共享大量数据。 总结来说,Android提供了多种多进程通信手段,开发者应根据实际需求选择合适的方法。理解并熟练运用这些通信机制...

    《Android系统源代码情景分析》

    《Android系统源代码情景分析》随书光盘内容(源代码) 目录如下: 第1篇 初识Android系统 第1章 准备知识 1.1 Linux内核参考书籍 1.2 Android应用程序参考书籍 1.3 下载、编译和运行Android源代码 ...

    Android底层开发技术实战详解--内核、移植和驱动.(电子工业.王振丽).part1

    4.5.1 移植各个Android部件的方式 116 4.5.2 移植技巧之一——不得不说的辅助工作 117 第5章 goldfish下的驱动解析 125 5.1 staging驱动 125 5.1.1 staging驱动概述 125 5.1.2 binder驱动...

    Android底层开发技术实战详解--内核、移植和驱动.(电子工业.王振丽).part3

    4.5.1 移植各个Android部件的方式 116 4.5.2 移植技巧之一——不得不说的辅助工作 117 第5章 goldfish下的驱动解析 125 5.1 staging驱动 125 5.1.1 staging驱动概述 125 5.1.2 binder驱动...

    Android 底层驱动原理

    Android引入了一些专有的驱动,如Ashmem(内存共享机制)、binder(进程间通信机制)和logger(日志系统)。这些驱动对于Android系统的独特功能至关重要,如跨进程数据传输和系统日志记录。 1.4 Linux设备驱动在...

Global site tag (gtag.js) - Google Analytics