Triển khai phân vùng mô-đun GKI

Các mô-đun GKI và GKI có thể được cập nhật độc lập với phần còn lại của phân vùng vì các mô-đun GKI nằm trên một phân vùng động riêng biệt trong siêu hình ảnh có tên system_dlkm . Các mô-đun GKI được Google ký bằng cặp khóa thời gian xây dựng kernel và chỉ tương thích với GKI mà chúng được tạo cùng. Không có sự ổn định ABI giữa các mô-đun GKI và GKI; để các mô-đun tải chính xác trong thời gian chạy, các mô-đun GKI và GKI phải được xây dựng và cập nhật cùng nhau.

Triển khai hỗ trợ phân vùng system_dklm

Phân vùng system_dlkm nằm trong siêu phân vùng dưới dạng một phân vùng động khác. Phân vùng này có thể chứa:

  • Các mô-đun hạt nhân đã được ký tại thời điểm xây dựng của Google
  • hiện vật depmod

Xây dựng system_dlkm

Xây dựng system_dlkm là một quá trình tương tự như xây dựng các phân vùng động khác. Thực hiện các bước sau để thêm system_dlkm vào bản dựng của bạn:

  1. Trong BoardConfig.mk , thêm các mục sau:

    BOARD_USES_SYSTEM_DLKMIMAGE := true
    BOARD_SYSTEM_DLKMIMAGE_FILE_SYSTEM_TYPE := $(TARGET_RO_FILE_SYSTEM_TYPE)
    TARGET_COPY_OUT_SYSTEM_DLKM := system_dlkm
    
  2. Trong danh sách phân vùng, thêm system_dlkm : BOARD_GOOGLE_SYSTEM_DYNAMIC_PARTITIONS_PARTITION_LIST := system_dlkm

  3. (Tùy chọn) Đối với thiết bị A/B và A/B ảo, hãy thêm dòng sau vào tệp device.mk cho thiết bị của bạn:

    AB_OTA_PARTITIONS += system_dlkm
    

Xác định các mô-đun hạt nhân để sao chép vào system_dlkm

Để các mô-đun tải thành công trong thời gian chạy, các mô-đun GKI và GKI phải được xây dựng cùng nhau. Do đó, bạn phải xác định các mô-đun hạt nhân trong bản dựng GKI cho kiến ​​trúc đích và cung cấp nó làm nguồn cho phân vùng system_dlkm trong quá trình xây dựng nền tảng.

Dành cho Android 13

Trỏ BOARD_SYSTEM_DLKM_SRC vào thư mục chứa các tệp đối tượng hạt nhân của mô-đun GKI cần thiết cho thiết bị làm đầu vào cho hệ thống xây dựng để tạo phân vùng system_dlkm . Ví dụ:

Cung cấp nguồn mô-đun GKI trong một thư mục và trỏ BOARD_SYSTEM_DLKM_SRC vào thư mục đó. Ví dụ:

  BOARD_SYSTEM_DLKM_SRC := kernel/prebuilts/5.10/arm64/system_dlkm_staging

Tại thời điểm xây dựng, các mô-đun được liệt kê trong BOARD_SYSTEM_DLKM_SRC được cài đặt trong $ANDROID_PRODUCT_OUT/system_dlkm .

Dành cho Android 14

Chúng tôi đã hợp lý hóa việc triển khai bằng các macro ( BOARD_*_KERNEL_MODULES ) đang được sử dụng cho các phân vùng *_dlkm khác. Danh sách các mô-đun GKI cần thiết cho thiết bị phải được tham chiếu bằng macro BOARD_SYSTEM_KERNEL_MODULES . Tại thời điểm xây dựng, các mô-đun này được cài đặt trong $ANDROID_PRODUCT_OUT/system_dlkm . Bất kỳ mô-đun nào trong phân vùng vendor_dlkm có phần phụ thuộc vào các mô-đun trong phân vùng system_dlkm đều tạo ra các tham chiếu chính xác trong tệp modules.dep cho phân vùng vendor_dlkm . Do sự phụ thuộc phân vùng chéo này được biểu thị bằng modules.dep , khi mô-đun nhà cung cấp được tải, mọi mô-đun GKI cần thiết sẽ được tải tự động.

Ví dụ: để cài đặt tất cả các mô-đun GKI trên phân vùng system_dlkm cho kernel GKI arm64 5.15 từ các bản dựng sẵn:

 BOARD_SYSTEM_KERNEL_MODULES := $(wildcard kernel/prebuilts/5.15/arm64/*.ko)

Gắn system_dlkm khi chạy

Tùy thuộc vào hệ thống tệp đang được sử dụng làm hệ thống tệp chỉ đọc, hãy thêm phần sau vào fstab của bạn để gắn phân vùng system_dlkm khi chạy:

ext4 dưới dạng hệ thống tệp chỉ đọc

  system_dlkm /system_dlkm ext4 noatime,ro,errors=panic wait,logical,first_stage_mount,slotselect,avb

erofs là hệ thống tập tin chỉ đọc

  system_dlkm /system_dlkm erofs ro wait,logical,first_stage_mount,slotselect,avb

Gắn phân vùng và tải mô-đun

Trong first_stage_init , phân vùng system_dlkm được gắn vào /system_dlkm dưới dạng hệ thống tệp chỉ đọc. Khi gắn kết thành công, các liên kết tượng trưng tại /system/lib/modules trỏ đến /system_dlkm/lib/modules sẽ có sẵn.

Sau đó, quy trình của nhà cung cấp, chẳng hạn như tập lệnh .rc , có thể tải các mô-đun hạt nhân dựa trên thứ tự được chỉ định trong modules.load . Quy trình của nhà cung cấp phải sử dụng liên kết tượng trưng /system/lib/modules để tải các mô-đun. Nếu cần, quy trình của nhà cung cấp cũng có thể tải các mô-đun sau đó.

SELinux

Mọi tệp trong phân vùng system_dlkm đều được gắn nhãn ngữ cảnh tệp là system_dlkm_file . Để tải tệp mô-đun GKI trong phân vùng system_dlkm , quy trình của nhà cung cấp chịu trách nhiệm tải các mô-đun cần có sepolicy trong miền của nhà cung cấp.

Ví dụ: dlkm_loader được Cuttlefish sử dụng để tải các mô-đun GKI có các quyền sau trong tệp chính sách shared/sepolicy/vendor/dlkm_loader.te :

allow dlkm_loader self:capability sys_module;
allow dlkm_loader system_dlkm_file:dir r_dir_perms;
allow dlkm_loader system_dlkm_file:file r_file_perms;
allow dlkm_loader system_dlkm_file:system module_load;

Xác thực phân vùng system-dlkm

Google cung cấp trường hợp kiểm tra GKI VTS để xác minh phân vùng system_dlkm . Để gọi thử nghiệm theo cách thủ công, hãy sử dụng lệnh atest sau:

  atest -c vts_dlkm_partition_test