Biên dịch và xác minh

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ủ.

  1. 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ạng my_overlay_dt_wo_header.dts (hoặc bất kỳ tệp nào) tên tệp mong muốn).
  2. 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ạng my_main_dt_with_include.dts (hoặc bất kỳ tệp nào) tên tệp mong muốn).
  3. Sử dụng dtc để biên dịch my_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
    
  4. Sử dụng dtc để kết xuất my_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, yz 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:

  1. Xác định bảng đang chạy và chọn bảng tương ứng sẽ được áp dụng.
  2. 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ằng Init có tự động thiết lập hệ thống ro.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";
	};
};