컨텐츠 바로가기

ASHMEM #2

http://fussion.egloos.com/10658386

ASHMEM

  • 이름이 붙여진 Memory Block
  • 커널이 만들어주면 프로세스간 Memory 를 사용할 수 있음
  • 사용방법

    1. fd = ashmem_create_region("my_shm_region", size);

      if(fd < 0)

        return -1;

      data = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);

      if(data == MAP_FAILED)

        goto out;

  • 보안적인 이유로 다른 프로세스들은 이름으로 접근할 수 없다. (my_shm_region)
  • 그러므로 다른 프로세스들이 ashmem 에 접근하고 싶으면 fd 를 사용하여 접근하면 되는데

    IPC Binding Interface 를 사용하여 접근한다.

  • IMemory.h 파일 참조

 

ASHMEM VS PMEM

  • ashmem 과 pmem 은 매우 유사하다
  • 둘다 프로세스간의 shared memory 를 쓰기위해 사용된다
  • ashmem 은 virtual memory 를 사용하지만 pmem 은 인접한 물리메모리를 사용한다.
  • ashmem 은 2개의 process 가 memory 를 참조하다가 쓰임이 끝나게 되면 그 메모리를 참조하던 모든

    fd 들은 close 하게 된다.

  • 하지만 pmem 은 직접 메모리를 해제해 주어야 한다.
  • ashmem 과 pmem 의 선택은 메모리를 연속적으로 선택하는것이 필요하느냐에 달려있다. (Physically contiguous buffer)
  • T-Mobile 의 G1 폰을 보면 여러 2D 연산을 하기 때문에 pmem heap 을 사용하였지만
  • 에뮬레이터는 pmem 의 드라이버를 지원하지 않기 때문에 에뮬레이터에서는 ashmem 을 사용하였다
  • 그래서 G1에서 ashmem 을 사용하게 되면 2D 하드웨어 엔진의 이식성을 잃게 된다..

 

 

 

안드로이드의 자바에서는 android.os.MemoryFile 이라는 Wrapper Class 를 통해 ashmem 을 사용할 수 있게 해주는듯 합니다.

     생성자(이름, length) 를 이용하여 메모리를 할당받고, readByte, writeByte 메소드를 사용하여 메모리를 읽고, 쓸 수 있습니다.

 

포팅할때도 ashmem 부분을 패치하라는 문서가 많이 보입니다.


덧글|신고