Mô-đun hóa vùng ION cho GKI

Nhiều OEM Android sửa đổi trình điều khiển hạt nhân ION vì nhiều lý do, chẳng hạn như thêm vùng nhớ của nhà cung cấp và tùy chỉnh quản lý bộ đệm (để biết chi tiết về những sửa đổi này, hãy tham khảo Tích hợp bộ cấp phát bộ nhớ ION ). Để cho phép các OEM giữ lại những sửa đổi như vậy khi sử dụng Hình ảnh hạt nhân chung (GKI) , Android Common Kernel v5.4 giới thiệu một khung để mô-đun hóa các vùng nhớ ION dành riêng cho nhà cung cấp trong khi vẫn tích hợp sẵn trình điều khiển ION lõi. Hình sau đây cho thấy bố cục hình ảnh hạt nhân .

Đống ION mô-đun

Hình 1. Trình điều khiển hạt nhân ION được mô-đun hóa

Đống ION mô-đun có những ưu điểm sau.

  • Trình điều khiển lõi ION có thể là một phần của hình ảnh GKI, cho phép tối ưu hóa hiệu suất và sửa lỗi tất cả các thiết bị độc lập với tất cả các thiết bị.
  • Trình điều khiển lõi ION trong kernel thông thường có thể xử lý việc đăng ký heap và quản lý giao diện cho không gian người dùng và máy khách kernel. Các mô-đun heap của nhà cung cấp chỉ được yêu cầu để triển khai các hoạt động heap tùy chỉnh.
  • Trình điều khiển lõi ION (là một phần của GKI) có thể bao gồm các móc nối để theo dõi việc sử dụng bộ nhớ dễ dàng hơn, điều này là không thể khi mỗi OEM có phiên bản trình điều khiển ION của riêng họ.
  • Vùng nhớ ION của nhà cung cấp mô-đun sẽ giúp mọi quá trình chuyển đổi trong tương lai sang vùng nhớ dmabuf trở nên dễ dàng hơn.

Thực thi

Các mô-đun heap ION có thể đăng ký các hoạt động dmabuf của riêng chúng để ghi đè các hoạt động được trình điều khiển ION lõi đăng ký. Một thao tác dmabuf (chẳng hạn như get_flags() ) không được trình điều khiển ION lõi hỗ trợ sẽ trả về -EOPNOTSUPP nếu việc triển khai heap thiếu các phần ghi đè cần thiết.

Để cải thiện hiệu suất, trình điều khiển dmabuf có thể thực hiện bảo trì bộ đệm một phần (xem danh sách thay đổi ). Máy khách hạt nhân có thể sử dụng các hàm dma_buf_begin_cpu_access_partialdma_buf_end_cpu_access_partial để thực hiện bảo trì bộ nhớ đệm một phần.

Hạt nhân chung của Android chứa các triển khai mô-đun của hệ thống và các vùng phân bổ bộ nhớ liền kề (CMA) để sử dụng làm tài liệu tham khảo cho quá trình mô-đun hóa vùng heap.

Những thay đổi đối với tiêu đề ION UAPI

Tiêu đề API không gian người dùng ION (UAPI) chứa một enum ion_heap_id để sử dụng trong việc xác định một phạm vi ID vùng heap để các vùng heap của nhà cung cấp sử dụng.

 /**
 * ion_heap_id - list of heap IDs that Android can use
 *
 * @ION_HEAP_SYSTEM        ID for the ION_HEAP_TYPE_SYSTEM
 * @ION_HEAP_DMA_START     Start of reserved ID range for heaps of type ION_HEAP_TYPE_DMA
 * @ION_HEAP_DMA_END       End of reserved ID range for heaps of type ION_HEAP_TYPE_DMA
 * @ION_HEAP_CUSTOM_START  Start of reserved ID range for heaps of custom type
 * @ION_HEAP_CUSTOM_END    End of reserved ID range for heaps of custom type
 */

enum ion_heap_id {

   ION_HEAP_SYSTEM = (1 << ION_HEAP_TYPE_SYSTEM),

   ION_HEAP_DMA_START = (ION_HEAP_SYSTEM << 1),

   ION_HEAP_DMA_END = (ION_HEAP_DMA_START << 7),
   ION_HEAP_CUSTOM_START = (ION_HEAP_DMA_END << 1),

   ION_HEAP_CUSTOM_END = (ION_HEAP_CUSTOM_START << 22),
};

Ngoài ra, IOCTL mới ( ION_IOC_ABI_VERSION ) có thể giúp khách hàng không gian người dùng xác định xem các vùng mô-đun có đang được sử dụng hay không.

Ghi đè vùng hệ thống chung

Vùng nhớ hệ thống ION được tích hợp sẵn và là một phần của hình ảnh GKI để đảm bảo rằng bất kỳ tính năng nào cần quyền truy cập vào vùng nhớ chung/độc lập với thiết bị đều có thể phụ thuộc vào sự tồn tại của nó. Do đó, bạn không thể ghi đè ID heap của ION_HEAP_SYSTEM . Để tạo vùng nhớ heap hệ thống tùy chỉnh, hãy sử dụng ID vùng nhớ heap trong phạm vi tùy chỉnh ( ION_HEAP_CUSTOM_START đến ION_HEAP_CUSTOM_END ) để thực hiện phân bổ.