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

MemoryHeapBase内存分配、Ashmem_create_Region mmap申请共享内存

阅读更多

几个与内存相关的类的头文件如下所示:
IMemory.h :定义内存相关类的接口,表示堆内存的类 IMemoryHeap BnMemoryHeap ,表示一般内存的类 IMemory BnMemory
MemoryHeapBase.h :定义类 MemoryHeapBase ,继承并实现 BnMemoryHeap
MemoryBase.h :定义类 MemoryBase ,继承并实现 BnMemory
在一般的使用过程中,通常是以使用 MemoryHeapBase 类分配一块堆内存(类似 malloc ),而 MemoryBase 表示从一块分配好堆内存中的一部分内存。

class AudioTrackJniStorage {

public:

sp<MemoryHeapBase> mMemHeap;// 这两个Memory 很重要

sp<MemoryBase> mMemBase;

audiotrack_callback_cookie mCallbackData;

int mStreamType;

bool allocSharedMem(int sizeInBytes) {

mMemHeap = new MemoryHeapBase(sizeInBytes, 0, "AudioTrack Heap Base");

mMemBase = new MemoryBase(mMemHeap, 0, sizeInBytes);

// 注意用法,先弄一个HeapBase ,再把HeapBase 传入到MemoryBase 中去。

return true;

}

};

2 MemoryHeapBase

MemroyHeapBase 也是 Android 搞的一套基于 Binder 机制的对内存操作的类。既然是 Binder 机制,那么肯定有一个服务端( Bnxxx ),一个代理端 Bpxxx 。看看 MemoryHeapBase 定义:

class MemoryHeapBase : public virtual BnMemoryHeap

{

果然,从BnMemoryHeap 派生,那就是Bn 端。这样就和Binder 挂上钩了

//Bp 端调用的函数最终都会调到Bn 这来

Binder 机制不了解的,可以参考:

http://blog.csdn.net/Innost/archive/2011/01/08/6124685.aspx

有好几个构造函数,我们看看我们使用的:

MemoryHeapBase::MemoryHeapBase(size_t size, uint32_t flags, char const * name)

: mFD(-1), mSize(0), mBase(MAP_FAILED), mFlags(flags),

mDevice(0), mNeedUnmap(false)

{

const size_t pagesize = getpagesize();

size = ((size + pagesize-1) & ~(pagesize-1));

// 创建共享内存,ashmem_create_region 这个是系统提供的, 可以不管它

// 设备上打开的是/dev/ashmem 设备,而Host 上打开的是一个tmp 文件

int fd = ashmem_create_region(name == NULL ? "MemoryHeapBase" : name, size);

mapfd(fd, size);// 把刚才那个fd 通过mmap 方式得到一块内存

// 不明白得去man mmap 看看

mapfd 完了后,mBase 变量指向内存的起始位置, mSize 是分配的内存大小,mFd

ashmem_create_region 返回的文件描述符

}

MemoryHeapBase 提供了一下几个函数,可以获取共享内存的大小和位置。

getBaseID()---> 返回mFd ,如果为负数,表明刚才创建共享内存失败了

getBase()-> 返回mBase ,内存位置

getSize()-> 返回mSize ,内存大小

有了 MemoryHeapBase ,又搞了一个 MemoryBase ,这又是一个和 Binder 机制挂钩的类。

唉,这个估计是一个在MemoryHeapBase 上的方便类吧?因为我看见了offset

那么估计这个类就是一个能返回当前Buffer 中写位置(就是offset )的方便类

这样就不用用户到处去计算读写位置了。

分享到:
评论

相关推荐

    ashmem C case

    ashmem_C实例C++层的

    Android-MemorySahre:在本机中使用 ashmem ipc

    流程一: 1.ashmeme_create_region 2.mmap 3.读或写共享内存。 4.关闭。 流程乙: 1.通过binder的ParcelFileDescriptor在两个进程之间事务fd。 因为 struct 文件对于 linux 内核是全局的。 所以 binder 驱动程序...

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

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

    安卓Ashmem使用实列

    安卓很多模块都用到了ashmem,为了更好的学习各个模块,了解ashmem的原理是必不可少的!

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

    android传递大文件的话,第一想到的就是匿名共享内存了,但是进程间怎么共享匿名共享内存的。试想进程A创建匿名共享内存,进程B怎么得共享内存读出数据?熬得凌晨2点多写个demo,备忘和分享!

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

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

    android Pmem 和ashmem 介绍

    结合例子介绍了android 中Pmem 的应用和ashmem 的区别

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

    第6章 Ashmem匿名共享内存系统 6.1 Ashmem驱动程序 6.1.1 基础数据结构 6.1.2 匿名共享内存设备的初始化过程 6.1.3 匿名共享内存设备文件的打开过程 6.1.4 匿名共享内存设备文件的内存映射过程 6.1.5 ...

    Android专用驱动

    Ashmem是一个共享内存驱动,它与传统的共享内存相比,最大的特点是它是通过文件描述符来描述的,并且可以动态地进行分块管理。动态分块管理的目的是可以将部分不再使用了的内存交回给系统,非常适合内存较小的移动...

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

    第6章 Ashmem匿名共享内存系统 6.1 Ashmem驱动程序 6.1.1 基础数据结构 6.1.2 匿名共享内存设备的初始化过程 6.1.3 匿名共享内存设备文件的打开过程 6.1.4 匿名共享内存设备文件的内存映射过程 6.1.5 匿名...

    android内存管理

    android内存管理目录 Low Memory Killer Ashmem Pmem dalvik虚拟机内存管理

    Android内核驱动—内存管理

    Android内核驱动—内存管理 Low Memory Killer Ashmem pmem

    Android系统源码情景分析

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

    Android系统源代码情景分析 [罗升阳 著] [高清版 带书签 840页]

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

    罗升阳-Android系统源代码情景分析(带书签完整高清版).pdf

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

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

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

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

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

    Android系统源代码情景分析》光盘内容

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

    android 情景分析源代码

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

    android中java和C的socket通信demo

    前段时间项目需求,ashmem通过java创建共享内存,在底层C程序接收fd后读数据,在别人的基础上修改,备忘。

Global site tag (gtag.js) - Google Analytics