Nhiều nhà sản xuất thiết bị gốc (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ớ 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ề các nội dung sửa đổi này, hãy tham khảo phần Tích hợp trình phân bổ bộ nhớ ION). Để cho phép OEM giữ lại các nội dung 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 hoá vùng nhớ khối xếp ION dành riêng cho nhà cung cấp, đồng thời vẫn tích hợp trình điều khiển ION cốt lõi. Hình sau đây cho thấy bố cục hình ảnh hạt nhân.
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ó 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ất cả các bản sửa lỗi và tính năng tối ưu hoá hiệu suất độc lập với thiết bị tiếp cận tất cả các thiết bị.
- Trình điều khiển lõi ION trong hạt nhân chung có thể xử lý việc đă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 hạt nhân. Bạn chỉ cần các mô-đun vùng nhớ khối xếp của nhà cung cấp để triển khai các thao tác vùng nhớ khối xếp tuỳ 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 trình bổ trợ để theo dõi mức sử dụng bộ nhớ dễ dàng hơn. Điều này không thể thực hiện được khi mỗi OEM có phiên bản trình điều khiển ION riêng.
- Vùng nhớ khối xếp ION của nhà cung cấp theo mô-đun sẽ giúp quá trình chuyển đổi trong tương lai 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ý các thao tác dmabuf
của riêng chúng để ghi đè các thao tác do trình điều khiển ION cốt lõi đăng ký. Thao tác dmabuf
(chẳng hạn như get_flags()
) không được trình điều khiển ION cốt lõi hỗ trợ sẽ trả về -EOPNOTSUPP
nếu quá trình triển khai vùng nhớ khối xếp thiếu các cơ chế 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 duy trì một phần bộ nhớ đệm (xem danh sách thay đổi).
Ứng dụng hạt nhân có thể sử dụng các hàm dma_buf_begin_cpu_access_partial
và dma_buf_end_cpu_access_partial
để thực hiện một phần việc bảo trì bộ nhớ đệm.
Hạt nhân chung của Android chứa các phương thức triển khai mô-đun của hệ thống và vùng nhớ khối xếp bộ cấp phát bộ nhớ liên tục (CMA) để dùng làm tài liệu tham khảo cho việc mô-đun hoá vùng nhớ khối xếp.
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
để xác định một loạt mã nhận dạng vùng nhớ khối xếp cho các 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, IOCTL
(ION_IOC_ABI_VERSION
) mới có thể giúp ứng dụng không gian người dùng xác định xem có đang sử dụng vùng nhớ khối xếp mô-đun 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 và là một phần của hình ảnh GKI để đảm bảo rằng mọi tính năng cần truy cập vào vùng nhớ khối xếp chung/không phụ thuộc vào thiết bị đều có thể phụ thuộc vào sự tồn tại của vùng nhớ khối xếp đó. Do đó, bạn không thể ghi đè mã vùng nhớ khối xếp của ION_HEAP_SYSTEM
. Để tạo vùng nhớ khối xếp hệ thống tuỳ chỉnh, hãy sử dụng mã nhận dạng vùng nhớ khối xếp trong phạm vi tuỳ chỉnh (ION_HEAP_CUSTOM_START
đến ION_HEAP_CUSTOM_END
) để thực hiện việc phân bổ.