Tổng quan về trình tải khởi động

Trình tải khởi động là một hình ảnh thuộc quyền sở hữu của nhà cung cấp, chịu trách nhiệm hiển thị nhân hệ điều hành trên thiết bị. Trình tải khởi động bảo vệ trạng thái thiết bị và chịu trách nhiệm khởi chạy Môi trường thực thi đáng tin cậy (TEE) cũng như liên kết gốc tin cậy của thiết bị. Trình tải khởi động cũng xác minh tính toàn vẹn của các phân vùng bootrecovery trước khi chuyển quá trình thực thi sang hạt nhân.

Ví dụ về quy trình của trình tải khởi động

Dưới đây là ví dụ về quy trình của trình tải khởi động:

  1. Tải và khởi tạo bộ nhớ.

  2. Xác minh thiết bị theo Quy trình khởi động đã xác minh.

  3. Xác minh các phân vùng khởi động, bao gồm boot, dtbo, init_bootrecovery, theo quy trình Xác minh quy trình khởi động. Trong bước này, hãy kiểm tra phiên bản tiêu đề hình ảnh khởi động và phân tích cú pháp tiêu đề cho phù hợp.

  4. Nếu sử dụng bản cập nhật A/B, hãy xác định khe hiện tại để khởi động.

  5. Xác định xem có nên khởi động chế độ khôi phục hay không. Để biết thêm thông tin, hãy xem phần Hỗ trợ bản cập nhật OTA.

  6. Tải hình ảnh khởi động, chẳng hạn như boot.img, vendor_boot.img, init_boot.img và các hình ảnh khởi động độc quyền khác của nhà cung cấp. Các hình ảnh khởi động này chứa hình ảnh hạt nhân và ổ đĩa RAM.

    1. Tải hạt nhân vào bộ nhớ dưới dạng tệp nhị phân nén tự thực thi. Hạt nhân tự giải nén và bắt đầu thực thi vào bộ nhớ.

    2. Tải ramdisk và phần bootconfig vào bộ nhớ để tạo initramfs.

Các tính năng khác liên quan đến trình tải khởi động

Sau đây là danh sách các tính năng bổ sung liên quan đến trình tải khởi động mà bạn có thể triển khai:

  • Lớp phủ cây thiết bị (DTO). Lớp phủ cây thiết bị cho phép trình tải khởi động hỗ trợ nhiều cấu hình phần cứng. DTO được biên dịch thành vùng nhớ khối cây thiết bị (DTB) mà trình tải khởi động sử dụng.

  • Sắp xếp ngẫu nhiên địa chỉ ảo cho hình ảnh kernel. Trình tải khởi động hỗ trợ việc tạo địa chỉ ảo ngẫu nhiên tại nơi tải hình ảnh hạt nhân. Để tạo địa chỉ ngẫu nhiên, hãy đặt RANDOMIZE_BASE thành true trong cấu hình hạt nhân. Trình tải khởi động phải cung cấp entropy bằng cách truyền một giá trị u64 ngẫu nhiên trong nút cây thiết bị /chosen/kaslr-seed.

  • Xác minh quy trình khởi động. Tính năng Xác minh quy trình khởi động cho phép trình tải khởi động đảm bảo tất cả mã được thực thi đều đến từ một nguồn đáng tin cậy.

  • Cấu hình khởi động. Cấu hình khởi động có trong Android 12 trở lên và là cơ chế truyền thông tin chi tiết về cấu hình từ bản dựng và trình tải khởi động đến hệ điều hành. Trước Android 12, các tham số dòng lệnh của hạt nhân có tiền tố là androidboot được sử dụng.

  • Cập nhật qua mạng không dây (OTA). Các thiết bị Android tại hiện trường có thể nhận và cài đặt bản cập nhật OTA cho hệ thống, phần mềm ứng dụng và quy tắc múi giờ. Tính năng này có tác động đến việc triển khai trình tải khởi động. Để biết thông tin chung về OTA, hãy xem bài viết Bản cập nhật OTA. Để biết thông tin chi tiết về cách triển khai OTA dành riêng cho trình tải khởi động, hãy xem phần Hỗ trợ bản cập nhật OTA.

  • Liên kết phiên bản. Tính năng liên kết phiên bản liên kết các khoá bảo mật với hệ điều hành và phiên bản cấp bản vá. Việc liên kết phiên bản đảm bảo rằng kẻ tấn công phát hiện ra điểm yếu trong phiên bản cũ của hệ thống hoặc phần mềm TEE không thể khôi phục thiết bị về phiên bản dễ bị tấn công và sử dụng các khoá được tạo bằng phiên bản mới hơn. Trình tải khởi động phải cung cấp một số thông tin nhất định để hỗ trợ liên kết phiên bản. Để biết thêm thông tin, hãy xem phần Thông tin phiên bản trong thuộc tính AVB.

Dòng lệnh hạt nhân

Kết hợp dòng lệnh hạt nhân từ các vị trí sau:

  • Dòng lệnh của trình tải khởi động: tập hợp các thông số tĩnh và động do trình tải khởi động xác định

  • Cây thiết bị: từ nút chosen/bootargs

  • defconfig: từ CONFIG_CMDLINE

  • boot.img: từ dòng lệnh (để biết độ lệch và kích thước, hãy tham khảo system/core/mkbootimg/bootimg.h

Kể từ Android 12, đối với các tham số androidboot.* mà chúng ta cần truyền đến không gian người dùng Android, chúng ta có thể sử dụng bootconfig thay vì dòng lệnh kernel.