Android系统匿名共享内存(Anonymous Shared Memory)C++调用接口分析

本文详细分析了Android系统匿名共享内存(Ashmem)的驱动程序、运行时库cutils的访问接口、MemoryHeapBase、MemoryBase的实现,以及应用实例和执行代码流程。重点讨论了在进程间如何通过Binder驱动程序实现文件描述符的有效转换,以达到共享内存的目的。
摘要由CSDN通过智能技术生成

一、Ashmem驱动程序

      ~/Android/kernel/goldfish

      ----include

              ----linux

                       ----ashmem.h

      ----mm

              ----ashmem.c

      驱动程序详解请看《Android系统源代码情景分析》,作者罗升阳。


二、运行时库cutils的匿名共享内存访问接口

      ~/Android/system/core

      ----libcutils

               ----ashmem-dev.c

       详解请看《Android系统源代码情景分析》,作者罗升阳。


三、MemoryHeapBase

1、Server端实现



        我们只分析下面3个类

        IMemoryHeap--->IMemory.h,IMemory.cpp

        BnMemoryHeap--->IMemory.h,IMemory.cpp

        MemoryHeapBase--->MemoryHeapBase.h,MemoryHeapBase.cpp

        详解请看《Android系统源代码情景分析》,作者罗升阳,这里只列出代码。

        

        IMemoryHeap(IMemory.h)

class IMemoryHeap : public IInterface
{
public:
    DECLARE_META_INTERFACE(MemoryHeap);

    // flags returned by getFlags()
    enum {
        READ_ONLY   = 0x00000001
    };

    virtual int         getHeapID() const = 0;
    virtual void*       getBase() const = 0;
    virtual size_t      getSize() const = 0;
    virtual uint32_t    getFlags() const = 0;

    // these are there just for backward source compatibility
    int32_t heapID() const { return getHeapID(); }
    void*   base() const  { return getBase(); }
    size_t  virtualSize() const { return getSize(); }
};
       

       BnMemoryHeap(IMemory.cpp)

status_t BnMemoryHeap::onTransact(
        uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
{
    switch(code) {
       case HEAP_ID: {
            CHECK_INTERFACE(IMemoryHeap, data, reply);
            reply->writeFileDescriptor(getHeapID());
            reply->writeInt32(getSize());
            reply->writeInt32(getFlags());
            return NO_ERROR;
        } break;
        default:
            return BBinder::onTransact(code, data, reply, flags);
    }
}
       

       MemoryHeapBase(MemoryHeapBase.cpp)

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));
    int fd = ashmem_create_region(name == NULL ? "MemoryHeapBase" : name, size);
    LOGE_IF(fd<0, "error creating ashmem region: %s", strerror(errno));
    if (fd >= 0) {
        if (mapfd(fd, size) == NO_ERROR) {
            if (flags & READ_ONLY) {
                ashmem_set_prot_region(fd, PROT_READ);
            }
        }
    }
}
......

status_t MemoryHeapBase::mapfd(int fd, size_t size, uint32_t offset)
{
    .....
    if ((mFlags & DONT_MAP_LOCALLY) == 0) {
        void* base = (uint8_t*)mmap(0, size,
                PROT_READ|PROT_WRITE, MAP_SHARED, fd, offset);
        ......
        mBase = base;
        mNeedUnmap = true;
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值