Bạn có thể sử dụng trình biên dịch cây thiết bị (DTC) để biên dịch nguồn cây thiết bị (DTS) tệp. Tuy nhiên, trước khi áp dụng cây thiết bị lớp phủ (DT) trên DT chính mục tiêu, bạn cũng nên xác minh kết quả bằng cách mô phỏng hành vi của lớp phủ cây thiết bị (DTO).
Biên dịch với DTC
Khi sử dụng dtc
để biên dịch .dts
, bạn phải thêm
-@
để thêm một nút __symbols__
trong
kết quả .dtbo
. Nút __symbols__
chứa
danh sách tất cả các nút được đánh dấu bằng nhãn mà thư viện DTO có thể sử dụng
để tham khảo.
Lệnh mẫu để tạo DT chính .dts
:
dtc -@ -O dtb -o my_main_dt.dtb my_main_dt.dts
Lệnh mẫu để tạo lớp phủ DT .dts
:
dtc -@ -O dtb -o my_overlay_dt.dtbo my_overlay_dt.dts
Xác minh kết quả của tổ chức buôn bán ma tuý trên máy chủ
Việc xác minh có thể giúp bạn xác định các lỗi có thể xảy ra khi đặt
lớp phủ DT trên DT chính. Trước khi cập nhật mục tiêu, bạn có thể xác minh
kết quả của việc phủ DT lên máy chủ bằng cách mô phỏng hành vi của DTO bằng cách sử dụng
/include/
trong .dts
.
Hình 1. Sử dụng cú pháp /include/ để mô phỏng DTO trên máy chủ.
- Tạo bản sao của lớp phủ
.dts
. Trong bản sao, hãy xoá tiêu đề dòng đầu tiên. Ví dụ:/dts-v1/; /plugin/;
Lưu tệp dưới dạngmy_overlay_dt_wo_header.dts
(hoặc bất kỳ tệp nào) tên tệp mong muốn). - Tạo bản sao của
.dts
chính. Trong bản sao, sau dòng cuối cùng, hãy thêm cú pháp include cho tệp mà bạn đã tạo ở bước 1. Ví dụ:/include/ "my_overlay_dt_wo_header.dts"
Lưu tệp dưới dạngmy_main_dt_with_include.dts
(hoặc bất kỳ tệp nào) tên tệp mong muốn). - Sử dụng
dtc
để biên dịchmy_main_dt_with_include.dts
để lấy DT đã hợp nhất. sẽ nhận được kết quả tương tự như DTO. Ví dụ:dtc -@ -O dtb -o my_merged_dt.dtb my_main_dt_with_include.dts
- Sử dụng
dtc
để kết xuấtmy_merged_dt.dto
.dtc -O dts -o my_merged_dt.dts my_merged_dt.dtb
Xác minh DTO trong Android 9
Android 9 yêu cầu lớp phủ blob cây thiết bị (DTBO). Cách thêm nút hoặc thay đổi các thuộc tính trong SoC DT, trình tải khởi động phải tự động phủ một DT dành riêng cho thiết bị lên SoC DT.
Cho biết lớp phủ đã áp dụng
Để bật
Bộ thử nghiệm nhà cung cấp (VTS) để đánh giá tính chính xác của lớp phủ
thì nhà cung cấp phải thêm một tham số dòng lệnh kernel mới
androidboot.dtbo_idx
cho biết các lớp phủ được chọn
phân vùng DTBO. Trong Android 12 sử dụng phiên bản kernel
5.10 trở lên, tham số này sẽ truyền qua bootconfig.
Ví dụ: thông số androidboot.dtbo_idx=x,y,z
báo cáo
x
, y
và z
làm chỉ mục gốc 0 của
các DTO từ phân vùng DTBO được áp dụng (theo thứ tự đó)
theo trình tải khởi động vào DT cơ sở.
Lớp phủ có thể áp dụng cho các nút từ DT chính hoặc thêm các nút mới, nhưng không thể tham chiếu đến nút đã thêm trong lớp phủ trước đó. Chiến dịch này vì ứng dụng lớp phủ không hợp nhất bảng biểu tượng lớp phủ có bảng biểu tượng DT chính (không hợp nhất tránh được xung đột về tên biểu tượng và chức năng của phần phụ thuộc giữa ).
Ví dụ: Lớp phủ không hợp lệ
Trong ví dụ này, overlay_2.dts
đề cập đến nút
e
, được thêm bởi
overlay_1.dts
. Sau khi áp dụng overlay_1
cho
DT chính, nếu bạn cố gắng áp dụng overlay_2
cho
DT tổng hợp, ứng dụng lớp phủ sẽ gặp lỗi với một lỗi biểu tượng
e
không có trong bảng biểu tượng cho
DT cơ sở.
main.dts | lớp phủ_1.dts | lớp phủ_2.dts |
---|---|---|
[main.dts] /dts-v1/; / { a: a {}; b: b {}; c: c {}; }; |
[overlay_1.dts] /dts-v1/; /plugin/; &b { ref1 = <&a>; e: e { prop = <0x0a>; phandle = <0x04>; }; }; |
[overlay_2.dts] /dts-v1/; /plugin/; /* invalid! */ &e { prop = <0x0b>; }; |
Ví dụ: Lớp phủ hợp lệ
Trong ví dụ này, overlay_2.dts
chỉ đề cập đến nút
b
trong DTS chính. Thời gian
overlay_1
được áp dụng cho DT cơ sở, sau đó là hàm
ứng dụng của overlay_2
, giá trị của thuộc tính
prop
trong nút e
(do overlay_1.dts
đặt) sẽ bị ghi đè bởi giá trị do
overlay_2.dts
.
main.dts | lớp phủ_1.dts | lớp phủ_2.dts |
---|---|---|
[final.dts] /dts-v1/; / { a: a {}; b: b {}; c: c {}; }; |
[overlay_1.dts] /dts-v1/; /plugin/; &b { ref1 = <&a>; e { prop = <0x0c>; }; }; |
[overlay_2.dts] /dts-v1/; /plugin/; /* valid */ &b { ref1 = <&c>; e { prop = <0x0d>; }; }; |
Triển khai phân vùng DTBO
Để triển khai phân vùng DTBO bắt buộc, hãy đảm bảo trình tải khởi động có thể thực hiện sau:
- Xác định bảng đang chạy và chọn bảng tương ứng sẽ được áp dụng.
- Thêm tham số
androidboot.dtbo_idx
vào nhân dòng lệnh.- Tham số này phải cho biết các chỉ mục từ 0 của DTO từ hình ảnh phân vùng DTBO, hình ảnh đó đã áp dụng cho DT cơ sở (trong cùng một cách đơn đặt hàng).
- Chỉ mục phải tham chiếu đến vị trí của lớp phủ trong DTBO phân vùng.
Để biết thông tin chi tiết về cấu trúc của phân vùng DTBO, vui lòng tham khảo nội dung Lớp phủ cây thiết bị.
Xác thực phân vùng DTBO
Bạn có thể sử dụng VTS để xác minh những thông tin sau:
- Sự tồn tại của tham số dòng lệnh kernel
androidboot.dtbo_idx
(bằng cách kiểm tra để đảm bảo rằngInit
có tự động thiết lập hệ thốngro.boot.dtbo_idx
tương ứng thuộc tính). - Tính hợp lệ của thuộc tính hệ thống
ro.boot.dtbo_idx
(theo kiểm tra để đảm bảo rằng cơ sở lưu trú chỉ định ít nhất một hình ảnh DTBO hợp lệ chỉ mục). - Tính hợp lệ của phân vùng DTBO (cũng xác minh các lớp phủ trong DTBO được áp dụng cho DT cơ sở).
- Các nút hoặc thay đổi khác về thuộc tính trong DT thu được được trình bày cho nhân hệ điều hành Linux.
Ví dụ: trong các lớp phủ và DT cuối cùng, việc thêm
androidboot.dtbo_idx=5,3
đến dòng lệnh kernel sẽ truyền
xác thực nhưng thêm androidboot.dtbo_idx=3,5
vào nhân
không vượt qua được quy trình xác thực.
Lớp phủ DT tại chỉ mục 3 | Lớp phủ DT tại chỉ mục 5 |
---|---|
[overlay_1.dts] /dts-v1/; /plugin/; &c { prop = <0xfe>; }; |
[overlay_2.dts] /dts-v1/; /plugin/; &c { prop = <0xff>; }; |
DT chung cuộc |
---|
/dts-v1/; / { một { phandle = <0x1>; }; b { phandle = <0x2>; }; c { phandle = <0x3>; prop = <0xfe>; }; __biểu tượng__ { a = "/a"; b = "/b"; c = "/c"; }; }; |