Uyuşturucu ticareti örgütlerini optimize edin

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ı

  1. Kitaplıkları dahil et. libufdt özelliğini kullanmak için şunu ekleyin: Veri yapıları ve API'ler için libfdt:
    #include <libfdt.h>
    #include <ufdt_overlay.h>
    
  2. 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);
    
  3. DT'leri üst üste bindirin:
    1. 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;
      
    2. 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);
      
    3. Şu öğenin boyutunu almak için merged_fdt hareketini kullanın: dtc_totalsize():
      merged_fdt_size = dtc_totalsize(merged_fdt);
      
    4. Çekirdeği başlatmak için birleştirilmiş DT'yi iletin:
      my_kernel_entry(0, machine_type, merged_fdt);
      
      .

Ö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);
}