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(Persistent Memory)和Ashmem(Anonymous Shared Memory)是两种用于进程间通信(IPC)和数据共享的技术,它们都是基于mmap系统调用来实现的。mmap允许不同的进程将同一段物理内存映射到各自的虚拟...
这样,一个进程创建的Ashmem内存区域,可以通过IPC的方式将文件描述符传递给其他进程,从而实现跨进程的数据共享。 在Android中,通常使用Binder机制来执行IPC,但当涉及到大文件或大量数据传输时,Binder可能效率...
在Android系统中,ashmem是通过Linux内核的一个扩展实现的,使得开发者可以创建和管理与硬件无关的共享内存区域。 在"ashmem C case"中,我们关注的是如何在C或C++层面上使用ashmem。在Android系统中,通常会涉及到...
在Android中,Ashmem通常与Binder IPC机制结合使用,以实现进程间的内存共享。 首先,理解Binder IPC机制是关键。Binder是Android系统的核心组件之一,它提供了一种安全、高效的进程间通信方式。Binder对象是Binder...
Ashmem机制通过/dev/ashmem设备文件实现,相关代码分布在include/linux/ashmem.h和drivers/staging/android/ashmem.c文件中。 接着,Android Logger提供了日志管理服务,它允许应用程序记录日志信息。Logger服务...
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驱动...
这个PPT讲Logger、Binder和Ashmem三个Android专用驱动的实现原理。由于这三个驱动在Android源代码里面用得非常广泛和频繁,因此理解它们的实现原理,就可以掌握Android的精华。这对以后阅读Android系统的其它代码,...
libandroid-shmem 在使用ashmem在Android上进行System V共享内存(shmget,shmat,shmdt和shmctl)仿真。 它创建的共享内存段将在创建过程销毁它们或死时自动销毁,这与System V共享内存行为不同。 基于先前工作。...
在Android系统中,Binder是进程间通信...总结,使用C++实现Android Binder服务和客户端,结合共享内存,能实现高效、低延迟的进程间通信。理解并熟练运用这些技术,对于开发高效能的Android系统级应用或服务至关重要。
Android专用驱动系统篇介绍了Logger日志驱动程序、Binder进程间通信驱动程序以及Ashmem匿名共享内存驱动程序;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的...
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”提供了一个示例项目“camera-ipc-sample-master”,用于探讨如何实现这一目标。 共享内存是一种有效的进程间通信(IPC,Inter-Process ...
Android系统使用的Linux内核包含了一些专用驱动,例如Logger、Binder、Ashmem、Wakelock、Low-Memory Killer和Alarm等,这些Android专用驱动构成了Android运行时的基石。Android运行时从下到上又包括了HAL层、应用...
本教程将详细解释如何在Android中实现Java和C的Socket通信,特别是在涉及文件描述符传递的场景下。 1. **Java Socket基础** Java中的`java.net.Socket`类提供了网络通信的能力,它允许我们在两个应用程序之间建立...
Android提供了MemoryFile类,它基于 ashmem(Android共享内存)机制,可用于在进程间共享大量数据。 总结来说,Android提供了多种多进程通信手段,开发者应根据实际需求选择合适的方法。理解并熟练运用这些通信机制...
《Android系统源代码情景分析》随书光盘内容(源代码) 目录如下: 第1篇 初识Android系统 第1章 准备知识 1.1 Linux内核参考书籍 1.2 Android应用程序参考书籍 1.3 下载、编译和运行Android源代码 ...
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驱动...
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引入了一些专有的驱动,如Ashmem(内存共享机制)、binder(进程间通信机制)和logger(日志系统)。这些驱动对于Android系统的独特功能至关重要,如跨进程数据传输和系统日志记录。 1.4 Linux设备驱动在...