12/08/2018, 17:04

Shared memory với Ashmem

Android ashmem Một tính năng mà google được thêm vào kernel linux là ashmem. Chúng ta có thể tạo ra một vùng nhớ mới bằng cách sử dụng lớp MemoryFile hoặc ashmem_create_region trên layer native, nhưng vì lý do bảo mật, chúng ta không thể mở vùng nhớ đó Giải pháp là tạo ra một service tạo vùng và ...

Android ashmem

Một tính năng mà google được thêm vào kernel linux là ashmem. Chúng ta có thể tạo ra một vùng nhớ mới bằng cách sử dụng lớp MemoryFile hoặc ashmem_create_region trên layer native, nhưng vì lý do bảo mật, chúng ta không thể mở vùng nhớ đó Giải pháp là tạo ra một service tạo vùng và trả lại cho client thông qua file descriptor.

Tại sao ashmem tốt hơn để chia sẻ bộ nhớ?

Ashmem có một vài ưu điểm so với các phương pháp chia sẻ bộ nhớ khác. Đó là một cách tuyệt vời để chia sẻ số lượng lớn dữ liệu giữa các ứng dụng hoặc giữa nhiều process trong một ứng dụng. Sự khác biệt chính giữa bộ nhớ chia sẻ Linux và bộ nhớ chia sẻ này là trong khi các tiến trình khác của Linux không thể giải phóng bộ nhớ chia sẻ nhưng ở đây nếu các tiến trình khác đòi hỏi bộ nhớ, hệ điều hành Android này sẽ giải phóng bộ nhớ này.

Ashmem cho phép các tiến trình chia sẻ bộ nhớ như thế nào?

Quá trình tạo vùng ashmem mới gồm các bước sau:

  • Mở file thiết bị, "/ dev / ashmem" và nhận file descriptor.
  • Gọi ioctl của ASHMEM_SET_NAME để đặt tên ashmem. Đây có thể là tệp thiết bị ảo, vì vậy nếu bạn đặt tên là "my_mem", tên tệp sẽ thay đổi thành "/ dev / ashmem / my_mem".
  • Gọi ASHMEM_SET_SIZE ioctl để thiết lập kích thước ashmem, theo byte.
  • Thư viện cutils có một hàm "ashmem_create_region"

kết hợp các bước này ta gọi hàm ashmem_create_region và có được một file descriptor:

int fd = ashmem_create_region ("my_mem", PAGE_SIZE * 20);

file descriptor có thể được chia sẻ với các quá trình khác. Android cung cấp một cách đặc biệt để chia sẻ các file descriptor giữa các process, sử dụng một dịch vụ khác gọi là "binder". Sau đó mỗi process mmaps file:

char * map = mmap (NULL, PAGE_SIZE * 20, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);

và như vậy bộ nhớ đã được chia sẻ             </div>
            
            <div class=

0