Bu sayfada, cihaz ağacı yer paylaşımı (DTO) uygulamanızda yapabileceğiniz optimizasyonlar anlatılmaktadır. kök düğümün yer paylaşımına karşı uygulanan kısıtlamaları, DTBO görüntüsünde sıkıştırılmış yer paylaşımlarını yapılandırma Ayrıca örnek olay, uygulama talimatları ve kodu.
Çekirdek komut satırı
Cihaz ağacındaki (DT) orijinal çekirdek komut satırı
chosen/bootargs
düğüm. Bootloader bunu birleştirmelidir
diğer çekirdek komut satırı kaynaklarıyla değiştirin:
/dts-v1/; / { chosen: chosen { bootargs = "..."; }; };
DTO, ana DT'deki değerleri ve DT'yi yer paylaşımlı olarak birleştiremez; bu nedenle
ana DT'nin çekirdek komut satırını
chosen/bootargs
ve yer paylaşımlı DT'nin çekirdek komut satırını
chosen/bootargs_ext
. Bootloader, daha sonra bunları
ve sonucu çekirdeğe aktarmanızı sağlar.
ana.dts | yer paylaşımlı.dts |
---|---|
/dts-v1/; / { chosen: chosen { bootargs = "..."; }; }; |
/dts-v1/; /plugin/; &chosen { bootargs_ext = "..."; }; |
Libufdt
En güncel
libfdt
.
uyuşturucu ticaretini destekleyen, uyuşturucu ticaretini uygulamak için libufdt
kullanılması önerilir mi?
(AOSP kaynağı:
platform/system/libufdt
).
libufdt
gerçek bir ağaç yapısı oluşturur (düzleştirilmemiş cihaz ağacı,
veya ufdt) aratarak
iki .dtb
dosyasının O(N2) değerinden O(N) değerine birleştirilmesi (burada N,
sayısını ifade eder.
Performans testi
Google'ın dahili testinde, 2405 üzerinde libufdt
kullanılarak
.dtb
ve 283 .dtbo
DT düğümleri, şu dosya boyutlarına neden olur:
70.618 ve 8.566 bayt. Şununla karşılaştırıldığında:
Uyuşturucu ticareti örgütleri
FreeBSD'den bağlantı noktası (124 ms çalışma zamanı), libufdt
DTO çalışma zamanı 10 ms'dir.
libufdt
ile Pixel cihazların performans testi karşılaştırması
libfdt
. Temel düğüm sayısı etkisi benzer olsa da
şu farklar var:
- 500 yer paylaşımı (ekleme veya geçersiz kılma) işlemi, 6 ila 8 kat daha uzun sürer fark
- 1.000 yer paylaşımı (ekleme veya geçersiz kılma) işlemi, 8 ila 10 kat daha uzun sürer fark
Sona ekleme sayısı X olarak ayarlanmış örnek:
Şekil 1. Ekleme sayısı X.
Geçersiz kılma sayısının X olarak ayarlandığı örnek:
Şekil 2. Geçersiz kılma sayısı X.
libufdt
, bazı libfdt
API'leri ve verilerle geliştirilmiştir
birlikte çalışır. libufdt
kullanırken URL'yi eklemeniz ve bağlamanız gerekir
libfdt
(ancak, kodunuzda libfdt
DTB veya DTBO'yu çalıştırmak için kullanılan API).
libufdt DTO API'sı
libufdt
bölgesinde DTO'ya gönderilen ana API aşağıdaki gibidir:
struct fdt_header *ufdt_apply_overlay( struct fdt_header *main_fdt_header, size_t main_fdt_size, void *overlay_fdt, size_t overlay_size);
main_fdt_header
parametresi ana DT'dir ve
overlay_fdt
,
.dtbo
dosyası. Döndürülen değer,
birleştirilmiş DT (veya hata durumunda null
). Birleştirilmiş DT biçimlendirilir
Bu, çekirdeği başlatırken çekirdeğe geçirebilirsiniz.
Döndürülen değerden yeni tampon, dto_malloc()
tarafından oluşturulur.
libufdt
öğesini bootloader'a taşırken uygulamanız gerekir.
Referans uygulamalar için
sysdeps/libufdt_sysdeps_*.c
Kök düğüm kısıtlamaları
Ana DT'nin kök düğümüyle yeni bir düğüm veya özellik paylaşamazsınız Çünkü yer paylaşımlı işlemler etiketlere dayanır. Çünkü ana DT, etiketi ve bindirme DT, etiketlerin üzerine yazılacak düğümleri atar. kök düğüm için bir etiket veremez (ve bu nedenle kök düğüm).
SoC tedarikçi firmaları, ana DT'nin yer paylaşımlı olma özelliğini tanımlamalıdır; ODM/OEM'ler yalnızca
SoC tedarikçisi tarafından tanımlanan etiketlerle düğümleri ekleme veya geçersiz kılma Kullanıcı
geçici çözüm olarak, odm
kök düğüm, yer paylaşımlı DT'deki tüm ODM düğümlerinin yeni düğümler eklenmesini etkinleştirir.
Alternatif olarak, temel DT'deki SoC ile ilgili tüm düğümleri bir
Aşağıda açıklandığı gibi, kök düğüm altındaki soc
düğümü:
ana.dts | yer paylaşımlı.dts |
---|---|
/dts-v1/; / { compatible = "corp,bar"; ... chosen: chosen { bootargs = "..."; }; /* nodes for all soc nodes */ soc { ... soc_device@0: soc_device@0 { compatible = "corp,bar"; ... }; ... }; odm: odm { /* reserved for overlay by odm */ }; }; |
/dts-v1/; /plugin/; / { }; &chosen { bootargs_ex = "..."; }; &odm { odm_device@0 { ... }; ... }; |
Sıkıştırılmış yer paylaşımları kullanma
Android 9, sıkıştırılmış yer paylaşımlarını kullanma desteği sunmaya başladı kullanarak DTBO resminde küçük resimler kullanabilirsiniz. DTBO başlığı v1 kullanılırken işaret alanının en önemli dört biti dt_table_Giriş değeri, DT girişinin sıkıştırma biçimini belirtir.
struct dt_table_entry_v1 { uint32_t dt_size; uint32_t dt_offset; /* offset from head of dt_table_header */ uint32_t id; /* optional, must be zero if unused */ uint32_t rev; /* optional, must be zero if unused */ uint32_t flags; /* For version 1 of dt_table_header, the 4 least significant bits of 'flags' are used to indicate the compression format of the DT entry as per the enum 'dt_compression_info' */ uint32_t custom[3]; /* optional, must be zero if unused */ };
Şu anda zlib
ve gzip
sıkıştırmaları desteklenmektedir.
enum dt_compression_info { NO_COMPRESSION, ZLIB_COMPRESSION, GZIP_COMPRESSION };
Android 9 ile sıkıştırılmış test desteği eklendi
yardımcı olmak için VtsFirmwareDtboVerification
testine yer paylaşımları
yer paylaşımlı uygulamanın doğruluğunu onaylayın.
Örnek DTO uygulaması
Aşağıdaki talimatlar, uyuşturucu ticareti örgütünün örnek bir uygulamasını size gösterir
libufdt
ile kullanın (örnek kod aşağıdadır).
Örnek DTO talimatları
- Kitaplıkları dahil et.
libufdt
özelliğini kullanmak için şunu ekleyin: Veri yapıları ve API'ler içinlibfdt
:#include <libfdt.h> #include <ufdt_overlay.h>
- Ana DT'yi yükle ve DT'yi bindirme.
.dtb
ve.dtbo
öğelerini yükle belleğe aktarır (adımlar tasarımınıza bağlıdır). Bu noktada.dtb
/.dtbo
tamponuna ve boyutuna sahip olmalısınız:main_size = my_load_main_dtb(main_buf, main_buf_size)
overlay_size = my_load_overlay_dtb(overlay_buf, overlay_buf_size);
- DT'leri üst üste bindirin:
- Ana DT'nin FDT başlığını almak için
ufdt_install_blob()
komutunu kullanın:main_fdt_header = ufdt_install_blob(main_buf, main_size); main_fdt_size = main_size;
- FDT'de birleştirilmiş DT almak için
ufdt_apply_overlay()
ile uyuşturucu ticareti örgütünü arayın biçim:merged_fdt = ufdt_apply_overlay(main_fdt_header, main_fdt_size, overlay_buf, overlay_size);
- Şu öğenin boyutunu almak için
merged_fdt
hareketini kullanın:dtc_totalsize()
:merged_fdt_size = dtc_totalsize(merged_fdt);
- Çekirdeği başlatmak için birleştirilmiş DT'yi iletin:
my_kernel_entry(0, machine_type, merged_fdt);
.
- Ana DT'nin FDT başlığını almak için
Örnek DTO kodu
#include <libfdt.h> #include <ufdt_overlay.h> … { struct fdt_header *main_fdt_header; struct fdt_header *merged_fdt; /* load main dtb into memory and get the size */ main_size = my_load_main_dtb(main_buf, main_buf_size); /* load overlay dtb into memory and get the size */ overlay_size = my_load_overlay_dtb(overlay_buf, overlay_buf_size); /* overlay */ main_fdt_header = ufdt_install_blob(main_buf, main_size); main_fdt_size = main_size; merged_fdt = ufdt_apply_overlay(main_fdt_header, main_fdt_size, overlay_buf, overlay_size); merged_fdt_size = dtc_totalsize(merged_fdt); /* pass to kernel */ my_kernel_entry(0, machine_type, merged_fdt); }