Mô-đun hoá vùng nhớ khối xếp ION cho GKI

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

Lượng ION theo mô-đun

Hình 1. Trình điều khiển nhân ION được mô-đun hoá

Vùng nhớ khối xếp ION mô-đun có các ưu điểm sau.

  • Trình điều khiển cốt lõi ION có thể là một phần của hình ảnh GKI, cho phép tất cả tối ưu hoá hiệu suất và sửa lỗi độc lập với thiết bị để tiếp cận thiết bị.
  • Trình điều khiển cốt lõi ION trong nhân hệ điều hành chung có thể xử lý hoạt động đăng ký vùng nhớ khối xếp và quản lý giao diện cho không gian người dùng và ứng dụng kernel. Mô-đun vùng nhớ khối xếp của nhà cung cấp chỉ được yêu cầu để triển khai thao tác vùng nhớ khối xếp tuỳ chỉnh.
  • Trình điều khiển lõi ION (như một phần của GKI) có thể chứa các hook để dễ dàng ghi nhớ hơn tính năng theo dõi mức sử dụng. Điều này không thể xảy ra khi mỗi OEM có phiên bản trình điều khiển ION.
  • Vùng nhớ khối xếp ION của nhà cung cấp theo mô-đun sẽ thực hiện mọi quá trình chuyển đổi sau này sang vùng nhớ khối xếp dmabuf dễ dàng hơn.

Triển khai

Các mô-đun vùng nhớ khối xếp ION có thể đăng ký thao tác dmabuf của riêng chúng để ghi đè những thao tác đó được đăng ký bằng trình điều khiển ION chính. Toán tử dmabuf (chẳng hạn như get_flags()) không được trình điều khiển ION chính hỗ trợ sẽ trả về -EOPNOTSUPP nếu vùng nhớ khối xếp quá trình triển khai thiếu thông tin 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 một phần bộ nhớ đệm bảo trì (xem danh sách thay đổi). Các ứng dụng kernel có thể dùng dma_buf_begin_cpu_access_partial và Các hàm dma_buf_end_cpu_access_partial để thực hiện bảo trì một phần bộ nhớ đệm.

Android Common Kernel chứa các mô-đun triển khai hệ thống và vùng nhớ khối xếp phân bổ bộ nhớ liền kề (CMA) để dùng làm tệp đối chiếu cho vùng nhớ khối xếp mô-đun hoá.

Các 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 xác định một loạt mã vùng nhớ khối xếp để vùng nhớ khối xếp 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, một IOCTL (ION_IOC_ABI_VERSION) mới có thể giúp các ứng dụng khách của không gian của người dùng xác định xem vùng nhớ khối xếp mô-đun có đang được sử dụng hay không.

Ghi đè vùng nhớ khối xếp chung của hệ thống

Vùng nhớ khối xếp 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ỳ cần quyền truy cập vào vùng nhớ khối xếp chung/độc lập với thiết bị có thể phụ thuộc vào vùng nhớ khối xếp sự tồn tại của mình. Do đó, bạn không thể ghi đè mã vùng nhớ khối xếp của ION_HEAP_SYSTEM. Người nhận tạo vùng nhớ khối xếp tuỳ chỉnh cho hệ thống, sử dụng mã vùng nhớ khối xếp trong dải ô tuỳ chỉnh (ION_HEAP_CUSTOM_START đến ION_HEAP_CUSTOM_END) để thực hiện phân bổ.