Thay đổi ABI ION

Các thiết bị vận chuyển nhân hệ điều hành phiên bản 4.14 trở lên chịu ảnh hưởng của hoạt động tái cấu trúc chính của mô-đun nhân ION. Đây là mô-đun mà nhiều phương thức triển khai lớp trừu tượng phần cứng (HAL) của trình phân bổ bộ nhớ đồ hoạ của nhà cung cấp gọi để phân bổ vùng đệm bộ nhớ dùng chung. Trang này cung cấp hướng dẫn về cách di chuyển mã nhà cung cấp cũ sang phiên bản ION mới và thảo luận về các điểm ngắt giao diện nhị phân ứng dụng (ABI) có thể xảy ra trong tương lai.

Giới thiệu về ION

ION là một phần của cây phân vùng đang trong quá trình phát triển của nhân nguồn cấp trên. Trong khi chạy thử, ABI từ không gian người dùng đến nhân hệ điều hành của ION có thể bị lỗi giữa các phiên bản nhân hệ điều hành chính. Mặc dù các điểm ngắt ABI ION không ảnh hưởng trực tiếp đến các ứng dụng thông thường hoặc thiết bị đã ra mắt, nhưng các nhà cung cấp di chuyển sang các phiên bản nhân chính mới có thể gặp phải những thay đổi ảnh hưởng đến mã nhà cung cấp gọi vào ION. Ngoài ra, các điểm ngắt ABI trong tương lai có thể xảy ra khi nhóm hệ thống Android làm việc với phần trên nguồn để di chuyển ION ra khỏi cây lưu trữ.

Các thay đổi trong android-4.14

Kernel 4.12 đã tái cấu trúc mạnh mẽ mã hạt nhân ION, dọn dẹp và xoá các phần của ION trùng lặp với các khung hạt nhân khác. Do đó, nhiều ion ION cũ không còn phù hợp nữa và đã bị xoá.

Xoá ứng dụng và tên người dùng ION

Trước nhân hệ điều hành 4.12, việc mở /dev/ion đã phân bổ một ứng dụng ION. ioctl ION_IOC_ALLOC đã phân bổ một vùng đệm mới và trả về vùng đệm đó cho không gian người dùng dưới dạng trình xử lý ION (một số nguyên mờ chỉ có ý nghĩa đối với ứng dụng ION đã phân bổ vùng đệm đó). Để ánh xạ vùng đệm vào không gian người dùng hoặc chia sẻ vùng đệm với các quy trình khác, các tay điều khiển ION được xuất lại dưới dạng dma-buf fds bằng cách sử dụng ioctl ION_IOC_SHARE.

Trong kernel 4.12, ioctl ION_IOC_ALLOC trực tiếp đầu ra dma-buf fds. Trạng thái tay điều khiển ION trung gian đã bị xoá, cùng với tất cả ioctl tiêu thụ hoặc tạo tay điều khiển ION. Vì các fd dma-buf không liên kết với các ứng dụng ION cụ thể, nên ioctl ION_IOC_SHARE không còn cần thiết và tất cả cơ sở hạ tầng ứng dụng ION đã bị xoá.

Thêm ioctls về tính tương quan của bộ nhớ đệm

Trước nhân hệ điều hành 4.12, ION đã cung cấp một ioctl ION_IOC_SYNC để đồng bộ hoá chỉ số mô tả tệp với bộ nhớ. Iotl này được lập tài liệu kém và không linh hoạt. Do đó, nhiều nhà cung cấp đã triển khai các ioctl tuỳ chỉnh để thực hiện việc bảo trì bộ nhớ đệm.

Kernel 4.12 đã thay thế ION_IOC_SYNC bằng DMA_BUF_IOCTL_SYNC ioctl được xác định trong linux/dma-buf.h. Gọi DMA_BUF_IOCTL_SYNC ở đầu và cuối mỗi lượt truy cập CPU, với cờ chỉ định xem các quyền truy cập này có phải là quyền đọc và/hoặc ghi hay không. Mặc dù DMA_BUF_IOCTL_SYNC chi tiết hơn ION_IOC_SYNC, nhưng lớp này cho phép không gian người dùng kiểm soát nhiều hơn các hoạt động bảo trì bộ nhớ đệm cơ bản.

DMA_BUF_IOCTL_SYNC là một phần của ABI ổn định của nhân và có thể sử dụng với tất cả dma-buf fds, cho dù ION có phân bổ các fds đó hay không.

Di chuyển mã nhà cung cấp sang android-4.12 trở lên

Đối với ứng dụng không gian người dùng, nhóm hệ thống Android khuyến khích bạn sử dụng libion thay vì mã nguồn mở cho các lệnh gọi ioctl(). Kể từ Android 9, libion sẽ tự động phát hiện ABI ION trong thời gian chạy và cố gắng che giấu mọi sự khác biệt giữa các hạt nhân. Tuy nhiên, mọi hàm libion đã tạo hoặc sử dụng tay điều khiển ion_user_handle_t sẽ không còn hoạt động sau hạt nhân 4.12. Bạn có thể thay thế các hàm này bằng các thao tác tương đương sau trên dma-buf fds, hoạt động trên tất cả các phiên bản hạt nhân cho đến nay.

Lệnh gọi ion_user_handle_t cũ Lệnh gọi fd dma-buf tương đương
ion_alloc(ion_fd, …, &buf_handle) ion_alloc_fd(ion_fd, ..., &buf_fd)
ion_share(ion_fd, buf_handle, &buf_fd) Không có (không cần lệnh gọi này với dma-buf fds)
ion_map(ion_fd, buf_handle, ...) mmap(buf_fd, ...)
ion_free(ion_fd, buf_handle) close(buf_fd)
ion_import(ion_fd, buf_fd, &buf_handle) Không có (không cần lệnh gọi này với dma-buf fds)
ion_sync_fd(ion_fd, buf_fd)
If (ion_is_legacy(ion_fd))
    ion_sync_fd(ion_fd, buf_fd);
else
    ioctl(buf_fd, DMA_BUF_IOCTL_SYNC, ...);

Đối với các ứng dụng trong nhân, vì ION không còn xuất bất kỳ API nào liên quan đến nhân hệ điều hành, nên các trình điều khiển từng sử dụng API nhân ION trong nhân hệ điều hành với ion_import_dma_buf_fd() phải được chuyển đổi để sử dụng API dma-buf trong nhân hệ điều hành với dma_buf_get().

Các điểm ngắt ABI ION trong tương lai

Trước khi có thể di chuyển ION ra khỏi cây lưu trữ, các bản phát hành nhân trong tương lai có thể cần phải phá vỡ lại ABI ION. Nhóm hệ thống Android không dự kiến những thay đổi này sẽ ảnh hưởng đến các thiết bị chạy phiên bản Android tiếp theo, nhưng những thay đổi như vậy có thể ảnh hưởng đến các thiết bị chạy các phiên bản Android tiếp theo.

Ví dụ: cộng đồng thượng nguồn đã đề xuất tách một nút /dev/ion thành nhiều nút trên mỗi vùng nhớ khối xếp (ví dụ: /dev/ion/heap0) để cho phép thiết bị áp dụng các chính sách SELinux khác nhau cho từng vùng nhớ khối xếp. Nếu thay đổi này được triển khai trong bản phát hành hạt nhân trong tương lai, thì việc này sẽ phá vỡ ION ABI.