Android 11, Genel Kernel kavramını ortaya çıkardı
Resim (GKI). GKI ile rastgele bir cihazın başlatılmasını etkinleştirmek için, Android
11 cihaz, başlatma görüntüsü başlığı sürüm 3'ü kullanabilir. İçinde
tedarikçi firmaya özgü tüm bilgiler boot
dışında dahil edilir
yeni bir vendor_boot
bölümüne taşındı. ARM64 cihazı
Android 11 ile 5.4 Linux çekirdeğinde kullanıma sunulduğunda
vendor_boot
bölümünü ve güncellenmiş boot
bölüm biçimini şu şekilde destekle:
ve GKI ile yapılan testlerden geçmelidir.
Android 12 cihazlar başlatma görüntüsü başlığı sürüm 4'ü kullanabilir.
vendor_boot
bölüm. Birden fazla tedarikçi firma ramdisk parçası birbiri ardına birleştiriliyor
yer alır. Bir tedarikçi firma ramdisk tablosu,
tedarikçi firma ramdisk bölümünün düzeni ve her tedarikçi firma ramdisk'inin meta verileri
olabilir.
Bölüm yapısı
Tedarikçi firma başlatma bölümü, sanal A/B ile A/B olarak ayarlanır ve Android tarafından korunur. Doğrulanmış Başlatma.
Sürüm 3
Bölüm bir başlık, tedarikçi firma diski ve cihaz ağacı blobundan oluşur. (DTB).
Bölüm | Sayfa sayısı |
---|---|
Tedarikçi firma başlatma başlığı (n sayfa) | n = (2112 + page_size - 1) / page_size |
Satıcı ramdisk'i (o sayfalar) | o = (vendor_ramdisk_size + page_size - 1) / page_size |
DTB (p sayfaları) | p = (dtb_size + page_size - 1) / page_size |
Sürüm 4
Bölüm bir başlıktan, tedarikçi firma ramdisk bölümünden ( birleştirilmiş), cihaz ağacı blob'u (DTB) ve tedarikçi firma ramdisk tablosu.
Bölüm | Sayfa sayısı |
---|---|
Tedarikçi firma başlatma başlığı (n sayfa) | n = (2128 + page_size - 1) / page_size |
Satıcı ramdisk parçaları (o sayfaları) | o = (vendor_ramdisk_size + page_size - 1) / page_size |
DTB (p sayfaları) | p = (dtb_size + page_size - 1) / page_size |
Tedarikçi firma ramdisk tablosu (q sayfaları) | q = (vendor_ramdisk_table_size + page_size - 1) / page_size |
Bootconfig (r sayfaları) | r = (bootconfig_size + page_size - 1) / page_size |
Tedarikçi firma başlatma başlığı
Tedarikçi firma başlatma bölümü başlığının içeriği temel olarak verilerden oluşur eskiden orada bulunan Başlatma görüntüsü başlığı. Google satıcı ramdisk'i hakkında da bilgi içerir.
Sürüm 3
struct vendor_boot_img_hdr_v3
{
#define VENDOR_BOOT_MAGIC_SIZE 8
uint8_t magic[VENDOR_BOOT_MAGIC_SIZE];
uint32_t header_version;
uint32_t page_size; /* flash page size we assume */
uint32_t kernel_addr; /* physical load addr */
uint32_t ramdisk_addr; /* physical load addr */
uint32_t vendor_ramdisk_size; /* size in bytes */
#define VENDOR_BOOT_ARGS_SIZE 2048
uint8_t cmdline[VENDOR_BOOT_ARGS_SIZE];
uint32_t tags_addr; /* physical addr for kernel tags */
#define VENDOR_BOOT_NAME_SIZE 16
uint8_t name[VENDOR_BOOT_NAME_SIZE]; /* asciiz product name */
uint32_t header_size; /* size of vendor boot image header in
* bytes */
uint32_t dtb_size; /* size of dtb image */
uint64_t dtb_addr; /* physical load address */
};
Sürüm 4
struct vendor_boot_img_hdr_v4
{
#define VENDOR_BOOT_MAGIC_SIZE 8
uint8_t magic[VENDOR_BOOT_MAGIC_SIZE];
uint32_t header_version;
uint32_t page_size; /* flash page size we assume */
uint32_t kernel_addr; /* physical load addr */
uint32_t ramdisk_addr; /* physical load addr */
uint32_t vendor_ramdisk_size; /* size in bytes */
#define VENDOR_BOOT_ARGS_SIZE 2048
uint8_t cmdline[VENDOR_BOOT_ARGS_SIZE];
uint32_t tags_addr; /* physical addr for kernel tags */
#define VENDOR_BOOT_NAME_SIZE 16
uint8_t name[VENDOR_BOOT_NAME_SIZE]; /* asciiz product name */
uint32_t header_size; /* size of vendor boot image header in
* bytes */
uint32_t dtb_size; /* size of dtb image */
uint64_t dtb_addr; /* physical load address */
uint32_t vendor_ramdisk_table_size; /* size in bytes for the vendor ramdisk table */
uint32_t vendor_ramdisk_table_entry_num; /* number of entries in the vendor ramdisk table */
uint32_t vendor_ramdisk_table_entry_size; /* size in bytes for a vendor ramdisk table entry */
uint32_t bootconfig_size; /* size in bytes for the bootconfig section */
};
#define VENDOR_RAMDISK_TYPE_NONE 0
#define VENDOR_RAMDISK_TYPE_PLATFORM 1
#define VENDOR_RAMDISK_TYPE_RECOVERY 2
#define VENDOR_RAMDISK_TYPE_DLKM 3
struct vendor_ramdisk_table_entry_v4
{
uint32_t ramdisk_size; /* size in bytes for the ramdisk image */
uint32_t ramdisk_offset; /* offset to the ramdisk image in vendor ramdisk section */
uint32_t ramdisk_type; /* type of the ramdisk */
#define VENDOR_RAMDISK_NAME_SIZE 32
uint8_t ramdisk_name[VENDOR_RAMDISK_NAME_SIZE]; /* asciiz ramdisk name */
#define VENDOR_RAMDISK_TABLE_ENTRY_BOARD_ID_SIZE 16
// Hardware identifiers describing the board, soc or platform which this
// ramdisk is intended to be loaded on.
uint32_t board_id[VENDOR_RAMDISK_TABLE_ENTRY_BOARD_ID_SIZE];
};
vendor_ramdisk_size
, tüm tedarikçi firma RAM disk parçalarının toplam boyutudur.ramdisk_type
, ramdisk'in türünü gösterir. Olası değerler şunlardır:VENDOR_RAMDISK_TYPE_NONE
, değerin belirtilmediğini gösterir.VENDOR_RAMDISK_TYPE_PLATFORM
RAM'leri platforma özel bitler içerir. Bootloader bunları her zaman belleğe yüklemelidir.VENDOR_RAMDISK_TYPE_RECOVERY
RAM'i kurtarma kaynakları içeriyor. İlgili içeriği oluşturmak için kullanılan Bootloader'ın bunları kurtarmaya başlarken belleğe yüklemesi gerekir.VENDOR_RAMDISK_TYPE_DLKM
RAM diskleri, dinamik yüklenebilir çekirdek içeriyor modüllerinde yer alır.
ramdisk_name
, ramdisk'in benzersiz bir adıdır.board_id
, tedarikçi firma tarafından tanımlanan donanım tanımlayıcılarının bir vektörüdür.
Bootloader desteği
Tedarikçi firma başlatma bölümü, Flash sayfası boyutu ve/veya alan adı gibi DTB'nin kendisi) aynı olacaktır. Bootloader'ın hem başlatma hem de satıcı başlatma işlemine erişmesi gerekir. bölüm oluşturmayı ve bölümleri değiştirmeyin.
Bootloader, genel ramdisk'i aşağıdaki işlemden hemen sonra belleğe yüklemelidir
CPIO, Gzip ve lz4 biçimleri bu tür dosya türlerini destekler.
birleştirme). Genel ramdisk resmini sayfalara hizalamayın veya
sonu ile bellekteki satıcı ram diskinin sonu arasında boşluk olmalıdır.
sıkıştırılmış dosyayı bir initramfs
olarak çıkarır,
Bu bir dosya yapısında, dosyanın üzerine yerleştirilmiş genel bir ramdisk
dosya yapısına dikkat edin.
Genel ramdisk ve satıcı ramdisk'i birleştirildiği için, aynı biçimdedir. GKI başlatma görüntüsü, lz4 ile sıkıştırılmış bir genel ramdisk kullanır, dolayısıyla GKI uyumlu bir cihazın lz4 ile sıkıştırılmış bir satıcı ramdisk'i kullanması gerekir. İlgili içeriği oluşturmak için kullanılan bununla ilgili yapılandırma ayarları aşağıda verilmiştir.
Bootconfig'in desteklenmesi için bootloader gereksinimleri şurada açıklanmıştır: Uygulama Bootconfig olarak ayarlayın.
Birden fazla tedarikçi firma RAM'i (sürüm 4)
Başlatma görüntüsü başlık sürümü 4'te, bootloader bir alt küme veya
tüm tedarikçi firma RAM'lerini başlatma sırasında initramfs
olarak yüklenecek şekilde ayarlayın. İlgili içeriği oluşturmak için kullanılan
tedarikçi ramdisk tablosu, her bir RAM diskinin meta verilerini içerir ve
bootloader'ı yükleyin. Bootloader,
genel ramdisk uzun olduğu sürece, seçilen tedarikçi firmanın RAM'lerini
en son yüklendi.
Örneğin, bootloader aşağıdaki türdeki tedarikçi firma RAM'lerini hariç tutabilir
Kaynakları korumak için normal başlatma sırasında VENDOR_RAMDISK_TYPE_RECOVERY
(Bu nedenle yalnızca
VENDOR_RAMDISK_TYPE_PLATFORM
ve
VENDOR_RAMDISK_TYPE_DLKM
belleğe yüklendi. Öte yandan tedarikçinin
VENDOR_RAMDISK_TYPE_PLATFORM
, VENDOR_RAMDISK_TYPE_RECOVERY
türündeki RAM'ler
ve VENDOR_RAMDISK_TYPE_DLKM
kurtarma sırasında belleğe yükleniyor
yatırım yapmanız önemlidir.
Alternatif olarak bootloader, tedarikçi firma ramdisk tablosunu yoksayabilir ve
bölümünü tamamen değiştirebilirsiniz. Bu, tüm reklam öğelerinin yüklenmesiyle
vendor_boot
bölümündeki tedarikçi firma ramdisk parçaları.
Derleme desteği
Bir cihaza satıcı başlatma desteğini uygulamak için:
BOARD_BOOT_HEADER_VERSION
değerini3
veya daha yüksek bir değere ayarlayın.Cihazınız GKI uyumluysa veya
BOARD_RAMDISK_USE_LZ4
özelliğinitrue
olarak ayarlayın. aksi takdirde lz4 ile sıkıştırılmış bir genel ramdisk kullanır.BOARD_VENDOR_BOOTIMAGE_PARTITION_SIZE
öğesini cihazınız için uygun bir boyuta ayarlayın tedarikçi firma RAM'inde bulunması gereken çekirdek modüllerini de göz önünde bulundurun.AB_OTA_PARTITIONS
uygulamasını,vendor_boot
ürününü ve tedarikçiye özel tüm öğeleri içerecek şekilde güncelleyin OTA bölümlerinin listesini görürsünüz.fstab
cihazınızıvendor_boot
uygulamasındaki/first_stage_ramdisk
uygulamasına kopyalayın bölümünü içerir,boot
bölümü değil. Örneğin,$(LOCAL_PATH)/fstab.hardware:$(TARGET_COPY_OUT_VENDOR_RAMDISK)/first_stage_ramdisk/fstab.$(PRODUCT_PLATFORM)
vendor_boot
öğesine birden fazla tedarikçi firma RAM'i eklemek için:
BOARD_BOOT_HEADER_VERSION
değerini4
olarak ayarlayın.BOARD_VENDOR_RAMDISK_FRAGMENTS
öğesini, mantıksal satıcı RAM'i içeren bir listeye ayarla parça adlarıvendor_boot
içine dahil edilecek.Önceden oluşturulmuş bir tedarikçi firma ramdisk'i eklemek için Önceden oluşturulmuş verilere
BOARD_VENDOR_RAMDISK_FRAGMENT.$(vendor_ramdisk).PREBUILT
eklendi yol'a dokunun.Bir DLKM tedarikçi diski eklemek için
BOARD_VENDOR_RAMDISK_FRAGMENT.$(vendor_ramdisk).KERNEL_MODULE_DIRS
- dahil edilecek çekirdek modülü dizinlerinin listesidir.BOARD_VENDOR_RAMDISK_FRAGMENT.$(vendor_ramdisk).MKBOOTIMG_ARGS
değerini şuna ayarla:mkbootimg
bağımsız değişken. Bunlar--board_id[0-15]
ve--ramdisk_type
için bağımsız değişkenlerin bir listesidir. DLKM tedarikçi ramdisk'i için aksi belirtilmediği takdirde varsayılan--ramdisk_type
DLKM
olur.
Kurtarma kaynaklarını vendor_boot
ürününde bağımsız bir recovery
RAM'i olarak oluşturmak için:
BOARD_BOOT_HEADER_VERSION
değerini4
olarak ayarlayın.BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT
değerinitrue
olarak ayarlayın.BOARD_INCLUDE_RECOVERY_RAMDISK_IN_VENDOR_BOOT
değerinitrue
olarak ayarlayın.- Bu işlem,
ramdisk_name
değerirecovery
ve değeri olan bir tedarikçi firma ramdisk parçası eklerramdisk_type
VENDOR_RAMDISK_TYPE_RECOVERY
. Ramdisk, altında bulunan tüm kurtarma dosyalarını$(TARGET_RECOVERY_ROOT_OUT)
mkbootimg bağımsız değişkenleri
Bağımsız değişken | Açıklama |
---|---|
--ramdisk_type |
Ramdisk türü, NONE ,
PLATFORM , RECOVERY veya DLKM .
|
--board_id[0-15] |
Varsayılan olarak 0 değerine ayarlanmış board_id vektörünü belirtin. |
Aşağıda örnek bir yapılandırma verilmiştir:
BOARD_KERNEL_MODULE_DIRS := foo bar baz
BOARD_BOOT_HEADER_VERSION := 4
BOARD_VENDOR_RAMDISK_FRAGMENTS := dlkm_foobar
BOARD_VENDOR_RAMDISK_FRAGMENT.dlkm_foobar.KERNEL_MODULE_DIRS := foo bar
BOARD_VENDOR_RAMDISK_FRAGMENT.dlkm_foobar.MKBOOTIMG_ARGS := --board_id0 0xF00BA5 --board_id1 0xC0FFEE
Sonuçta ortaya çıkan vendor_boot
, iki tedarikçi firma ramdisk parçası içerir. İlgili içeriği oluşturmak için kullanılan
İlki "varsayılan" baz
ve DLKM dizinini içeren ramdisk
$(TARGET_VENDOR_RAMDISK_OUT)
klasöründeki diğer dosyalar. İkincisi ise
foo
ve bar
DLKM dizinlerini içeren dlkm_foobar
ramdisk ve
--ramdisk_type
, varsayılan olarak DLKM
değerine ayarlanır.