Android 11 giới thiệu khái niệm Hạt nhân chung
Hình ảnh (GKI). Để bật tính năng khởi động một thiết bị tuỳ ý bằng GKI, Android
11 thiết bị có thể sử dụng tiêu đề hình ảnh khởi động phiên bản 3. Trong
phiên bản 3, tất cả thông tin cụ thể theo nhà cung cấp đều được loại khỏi boot
và được chuyển vào phân vùng vendor_boot
mới. Thiết bị ARM64
khởi chạy bằng Android 11 trên nhân hệ điều hành Linux 5.4 phải
hỗ trợ phân vùng vendor_boot
và định dạng phân vùng boot
đã cập nhật thành
vượt qua bài kiểm thử với GKI.
Thiết bị Android 12 có thể sử dụng tiêu đề hình ảnh khởi động phiên bản 4,
hỗ trợ đưa nhiều ổ đĩa cứng của nhà cung cấp vào vendor_boot
phân vùng. Nhiều mảnh ramdisk của nhà cung cấp được nối lần lượt với nhau
trong phần ổ đĩa cứng của nhà cung cấp. Bảng ramdisk của nhà cung cấp được dùng để mô tả
bố cục của phần ramdisk của nhà cung cấp và siêu dữ liệu của mỗi ramdisk của nhà cung cấp
mảnh.
Cấu trúc phân vùng
Phân vùng khởi động nhà cung cấp là A/B-ed với A/B ảo và được Android bảo vệ Xác minh quy trình khởi động.
Phiên bản 3
Phân vùng bao gồm một tiêu đề, ổ đĩa ram của nhà cung cấp và blob cây thiết bị (DTB).
Khu | Số trang |
---|---|
Tiêu đề khởi động về nhà cung cấp (n trang) | n = (2112 + page_size - 1) / page_size |
Ổ đĩa RAM của nhà cung cấp (các trang o) | o = (vendor_ramdisk_size + page_size - 1) / page_size |
DTB (trang p) | p = (dtb_size + page_size - 1) / page_size |
Phiên bản 4
Phân vùng bao gồm một tiêu đề, phần ổ đĩa ram của nhà cung cấp (bao gồm tất cả các mảnh ramdisk của nhà cung cấp, được nối với nhau), blob cây thiết bị (DTB) và bảng ổ đĩa cứng của nhà cung cấp.
Khu | Số trang |
---|---|
Tiêu đề khởi động về nhà cung cấp (n trang) | n = (2128 + page_size - 1) / page_size |
Mảnh ramdisk của nhà cung cấp (các trang o) | o = (vendor_ramdisk_size + page_size - 1) / page_size |
DTB (trang p) | p = (dtb_size + page_size - 1) / page_size |
Bảng ổ đĩa cứng của nhà cung cấp (trang q) | q = (vendor_ramdisk_table_size + page_size - 1) / page_size |
Bootconfig (trang r) | r = (bootconfig_size + page_size - 1) / page_size |
Tiêu đề khởi động của nhà cung cấp
Nội dung của tiêu đề phân vùng khởi động nhà cung cấp chủ yếu bao gồm dữ liệu đã được chuyển đến đó từ tiêu đề của hình ảnh khởi động. Nó cũng chứa thông tin về ổ đĩa ramdisk của nhà cung cấp.
Phiên bản 3
struct vendor_boot_img_hdr_v3
{
#define VENDOR_BOOT_MAGIC_SIZE 8
uint8_t magic[VENDOR_BOOT_MAGIC_SIZE];
uint32_t header_version;
uint32_t page_size; /* flash page size we assume */
uint32_t kernel_addr; /* physical load addr */
uint32_t ramdisk_addr; /* physical load addr */
uint32_t vendor_ramdisk_size; /* size in bytes */
#define VENDOR_BOOT_ARGS_SIZE 2048
uint8_t cmdline[VENDOR_BOOT_ARGS_SIZE];
uint32_t tags_addr; /* physical addr for kernel tags */
#define VENDOR_BOOT_NAME_SIZE 16
uint8_t name[VENDOR_BOOT_NAME_SIZE]; /* asciiz product name */
uint32_t header_size; /* size of vendor boot image header in
* bytes */
uint32_t dtb_size; /* size of dtb image */
uint64_t dtb_addr; /* physical load address */
};
Phiên bản 4
struct vendor_boot_img_hdr_v4
{
#define VENDOR_BOOT_MAGIC_SIZE 8
uint8_t magic[VENDOR_BOOT_MAGIC_SIZE];
uint32_t header_version;
uint32_t page_size; /* flash page size we assume */
uint32_t kernel_addr; /* physical load addr */
uint32_t ramdisk_addr; /* physical load addr */
uint32_t vendor_ramdisk_size; /* size in bytes */
#define VENDOR_BOOT_ARGS_SIZE 2048
uint8_t cmdline[VENDOR_BOOT_ARGS_SIZE];
uint32_t tags_addr; /* physical addr for kernel tags */
#define VENDOR_BOOT_NAME_SIZE 16
uint8_t name[VENDOR_BOOT_NAME_SIZE]; /* asciiz product name */
uint32_t header_size; /* size of vendor boot image header in
* bytes */
uint32_t dtb_size; /* size of dtb image */
uint64_t dtb_addr; /* physical load address */
uint32_t vendor_ramdisk_table_size; /* size in bytes for the vendor ramdisk table */
uint32_t vendor_ramdisk_table_entry_num; /* number of entries in the vendor ramdisk table */
uint32_t vendor_ramdisk_table_entry_size; /* size in bytes for a vendor ramdisk table entry */
uint32_t bootconfig_size; /* size in bytes for the bootconfig section */
};
#define VENDOR_RAMDISK_TYPE_NONE 0
#define VENDOR_RAMDISK_TYPE_PLATFORM 1
#define VENDOR_RAMDISK_TYPE_RECOVERY 2
#define VENDOR_RAMDISK_TYPE_DLKM 3
struct vendor_ramdisk_table_entry_v4
{
uint32_t ramdisk_size; /* size in bytes for the ramdisk image */
uint32_t ramdisk_offset; /* offset to the ramdisk image in vendor ramdisk section */
uint32_t ramdisk_type; /* type of the ramdisk */
#define VENDOR_RAMDISK_NAME_SIZE 32
uint8_t ramdisk_name[VENDOR_RAMDISK_NAME_SIZE]; /* asciiz ramdisk name */
#define VENDOR_RAMDISK_TABLE_ENTRY_BOARD_ID_SIZE 16
// Hardware identifiers describing the board, soc or platform which this
// ramdisk is intended to be loaded on.
uint32_t board_id[VENDOR_RAMDISK_TABLE_ENTRY_BOARD_ID_SIZE];
};
vendor_ramdisk_size
là tổng kích thước của tất cả các mảnh ramdisk của nhà cung cấp.ramdisk_type
biểu thị loại ổ đĩa ram, các giá trị có thể có là:VENDOR_RAMDISK_TYPE_NONE
cho biết giá trị chưa được chỉ định.- Ổ đĩa
VENDOR_RAMDISK_TYPE_PLATFORM
chứa các bit dành riêng cho nền tảng. Trình tải khởi động phải luôn tải các thông tin này vào bộ nhớ. VENDOR_RAMDISK_TYPE_RECOVERY
ổ đĩa cứng chứa tài nguyên khôi phục. Chiến lược phát hành đĩa đơn trình tải khởi động phải tải chúng vào bộ nhớ khi khởi động vào quá trình khôi phục.VENDOR_RAMDISK_TYPE_DLKM
ổ đĩa RAM chứa nhân hệ điều hành có thể tải động các mô-đun.
ramdisk_name
là tên riêng biệt của ổ đĩa RAM.board_id
là một vectơ cho biết các giá trị nhận dạng phần cứng do nhà cung cấp xác định.
Hỗ trợ trình tải khởi động
Vì phân vùng khởi động nhà cung cấp chứa thông tin (chẳng hạn như kích thước trang flash, nhân hệ điều hành, địa chỉ tải ramdisk, chính DTB) trước đó đã tồn tại trong phân vùng khởi động, trình tải khởi động phải truy cập cả tính năng khởi động lẫn khởi động nhà cung cấp để có đủ dữ liệu hoàn tất khởi động.
Trình tải khởi động phải tải ramdisk chung vào bộ nhớ ngay lập tức sau đây
ramdisk của nhà cung cấp (các định dạng CPIO, Gzip và lz4 hỗ trợ loại tệp này
nối). Đừng căn chỉnh trang hình ảnh ổ đĩa RAM chung chung hoặc đưa ra bất kỳ
khoảng trống khác giữa nó và phần cuối của ổ đĩa ram của nhà cung cấp trong bộ nhớ. Sau
hạt nhân giải nén, thì hệ thống sẽ trích xuất tệp đã nối thành initramfs
,
dẫn đến cấu trúc tệp là một ổ đĩa ram chung được phủ lên
cấu trúc tệp ramdisk của nhà cung cấp.
Vì ổ đĩa RAM thông thường và ổ đĩa cứng của nhà cung cấp được nối với nhau, nên chúng phải ở trong có cùng định dạng. Hình ảnh khởi động GKI sử dụng ổ đĩa ramdisk chung được nén lz4, do đó, thiết bị tuân thủ GKI phải sử dụng ramdisk của nhà cung cấp được nén theo chuẩn lz4. Chiến lược phát hành đĩa đơn cho phần này được hiển thị bên dưới.
Các yêu cầu về trình tải khởi động để hỗ trợ cấu hình khởi động được giải thích trong Triển khai Cấu hình khởi động.
Nhiều ổ đĩa ram của nhà cung cấp (phiên bản 4)
Với tiêu đề hình ảnh khởi động phiên bản 4, trình tải khởi động có thể chọn một tập hợp con hoặc
tất cả ổ đĩa cứng của nhà cung cấp để tải dưới dạng initramfs
trong thời gian khởi động. Chiến lược phát hành đĩa đơn
bảng ramdisk của nhà cung cấp chứa siêu dữ liệu của mỗi ramdisk và có thể hỗ trợ
trình tải khởi động để quyết định tải ổ đĩa RAM nào. Trình tải khởi động có thể quyết định
để tải ổ đĩa ram của nhà cung cấp đã chọn, miễn là ổ đĩa ram thông thường
được tải sau cùng.
Ví dụ: trình tải khởi động có thể bỏ qua việc tải ổ đĩa cứng của nhà cung cấp thuộc loại
VENDOR_RAMDISK_TYPE_RECOVERY
trong thời gian khởi động bình thường để tiết kiệm tài nguyên, vì vậy chỉ
ổ đĩa cứng của nhà cung cấp loại VENDOR_RAMDISK_TYPE_PLATFORM
và
VENDOR_RAMDISK_TYPE_DLKM
được tải vào bộ nhớ. Mặt khác, nhà cung cấp
ổ đĩa cứng loại VENDOR_RAMDISK_TYPE_PLATFORM
, VENDOR_RAMDISK_TYPE_RECOVERY
và VENDOR_RAMDISK_TYPE_DLKM
được tải vào bộ nhớ khi khởi động vào quá trình khôi phục
.
Ngoài ra, trình tải khởi động có thể bỏ qua bảng ramdisk của nhà cung cấp và tải
toàn bộ phần ổ đĩa cứng của nhà cung cấp. Thao tác này có tác động tương tự như việc tải tất cả
các mảnh ramdisk của nhà cung cấp trong phân vùng vendor_boot
.
Hỗ trợ bản dựng
Cách triển khai tính năng hỗ trợ khởi động nhà cung cấp cho một thiết bị:
Đặt
BOARD_BOOT_HEADER_VERSION
thành3
trở lên.Đặt
BOARD_RAMDISK_USE_LZ4
thànhtrue
nếu thiết bị của bạn tuân thủ GKI hoặc nếu nếu không, nó sẽ sử dụng ramdisk chung được nén lz4.Đặt
BOARD_VENDOR_BOOTIMAGE_PARTITION_SIZE
ở kích thước phù hợp với để xem xét các mô-đun nhân phải được lưu trữ trên ổ đĩa ramdisk của nhà cung cấp.Cập nhật
AB_OTA_PARTITIONS
để bao gồmvendor_boot
và mọi công cụ tuỳ chỉnh theo nhà cung cấp danh sách phân vùng OTA trên thiết bị.Sao chép thiết bị
fstab
vào/first_stage_ramdisk
trongvendor_boot
chứ không phải phân vùngboot
. Chẳng hạn như$(LOCAL_PATH)/fstab.hardware:$(TARGET_COPY_OUT_VENDOR_RAMDISK)/first_stage_ramdisk/fstab.$(PRODUCT_PLATFORM)
.
Cách thêm nhiều ổ đĩa cứng của nhà cung cấp vào vendor_boot
:
- Đặt
BOARD_BOOT_HEADER_VERSION
thành4
. Đặt
BOARD_VENDOR_RAMDISK_FRAGMENTS
thành danh sách ổ đĩa RAM của nhà cung cấp logic tên mảnh để đưa vàovendor_boot
.Để thêm ổ đĩa ramdisk tạo sẵn của nhà cung cấp, hãy đặt
BOARD_VENDOR_RAMDISK_FRAGMENT.$(vendor_ramdisk).PREBUILT
sang thư viện tạo sẵn đường dẫn.Để thêm ổ đĩa RAM của nhà cung cấp DLKM, hãy đặt
BOARD_VENDOR_RAMDISK_FRAGMENT.$(vendor_ramdisk).KERNEL_MODULE_DIRS
vào danh sách các thư mục mô-đun nhân cần được đưa vào.Đặt
BOARD_VENDOR_RAMDISK_FRAGMENT.$(vendor_ramdisk).MKBOOTIMG_ARGS
thành Đối sốmkbootimg
. Đó là--board_id[0-15]
và--ramdisk_type
cho mảnh ramdisk của nhà cung cấp. Đối với ramdisk của nhà cung cấp DLKM,--ramdisk_type
mặc định sẽ làDLKM
nếu không được chỉ định khác.
Cách tạo tài nguyên khôi phục dưới dạng một ổ đĩa recovery
độc lập trong vendor_boot
:
- Đặt
BOARD_BOOT_HEADER_VERSION
thành4
. - Đặt
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT
thànhtrue
. - Đặt
BOARD_INCLUDE_RECOVERY_RAMDISK_IN_VENDOR_BOOT
thànhtrue
. - Thao tác này sẽ thêm một mảnh ramdisk của nhà cung cấp có
ramdisk_name
làrecovery
vàramdisk_type
làVENDOR_RAMDISK_TYPE_RECOVERY
. Khi đó, ổ đĩa RAM sẽ chứa tất cả các tệp khôi phục, là các tệp được cài đặt trong$(TARGET_RECOVERY_ROOT_OUT)
.
đối số mkbootimg
Đối số | Mô tả |
---|---|
--ramdisk_type |
Loại ổ đĩa cứng, có thể là một trong các loại NONE ,
PLATFORM , RECOVERY hoặc DLKM .
|
--board_id[0-15] |
Chỉ định vectơ board_id , mặc định là 0 . |
Sau đây là một cấu hình mẫu:
BOARD_KERNEL_MODULE_DIRS := foo bar baz
BOARD_BOOT_HEADER_VERSION := 4
BOARD_VENDOR_RAMDISK_FRAGMENTS := dlkm_foobar
BOARD_VENDOR_RAMDISK_FRAGMENT.dlkm_foobar.KERNEL_MODULE_DIRS := foo bar
BOARD_VENDOR_RAMDISK_FRAGMENT.dlkm_foobar.MKBOOTIMG_ARGS := --board_id0 0xF00BA5 --board_id1 0xC0FFEE
vendor_boot
thu được sẽ chứa 2 mảnh ramdisk của nhà cung cấp. Chiến lược phát hành đĩa đơn
danh sách đầu tiên là "mặc định" ramdisk, chứa thư mục DLKM baz
và
các tệp còn lại trong $(TARGET_VENDOR_RAMDISK_OUT)
. Điều thứ hai là
ramdisk dlkm_foobar
, chứa các thư mục DLKM foo
và bar
, và
--ramdisk_type
mặc định là DLKM
.