Bootloader'a genel bakış

Bootloader, bir cihazda çekirdeği başlatmaktan sorumlu olan, tedarikçiye özel bir resimdir. Önyükleme yükleyici, cihaz durumunu korur ve Güvenilir Yürütme Ortamı'nı (TEE) başlatmaktan ve güven kökünü bağlamaktan sorumludur. Önyükleme programı, yürütmeyi çekirdeğe taşımadan önce boot ve recovery bölümlerinin bütünlüğünü de doğrular.

Örnek önyükleyici akışı

Aşağıda bir önyükleyici akışı örneği verilmiştir:

  1. Belleği yükleyip başlatın.

  2. Cihazı Doğrulanmış Başlatma akışına göre doğrulayın.

  3. boot, dtbo, init_boot ve recovery dahil olmak üzere önyükleme bölümlerinin Doğrulanmış Başlatma akışına göre doğrulanmasını sağlayın. Bu adım kapsamında, önyükleme resmi üstbilgisinin sürümünü kontrol edin ve üstbilgiyi buna göre ayrıştırın.

  4. A/B güncellemeleri kullanılıyorsa önyükleme için geçerli yuvası belirleyin.

  5. Kurtarma modunun başlatılıp başlatılmayacağını belirleyin. Daha fazla bilgi için OTA güncellemelerini destekleme başlıklı makaleyi inceleyin.

  6. boot.img, vendor_boot.img, init_boot.img gibi önyükleme resimlerini ve diğer özel tedarikçi önyükleme resimlerini yükleyin. Bu önyükleme resimleri, çekirdek ve ramdisk resimlerini içerir.

    1. Çekirdeği, kendi kendine yürütülebilir sıkıştırılmış ikili kod olarak belleğe yükleyin. Çekirdek kendi sıkıştırmasını kaldırır ve bellekte çalışmaya başlar.

    2. initramfs oluşturmak için ramdisk'leri ve bootconfig bölümünü belleğe yükleyin.

Önyükleme yükleyiciyle ilgili ek özellikler

Aşağıda, uygulayabileceğiniz ek önyükleyici özelliklerinin listesi verilmiştir:

  • Cihaz ağacı yer paylaşımı (DTO). Cihaz ağacı yer paylaşımı, önyükleyicinin farklı donanım yapılandırmalarını desteklemesine olanak tanır. DTO, önyükleyici tarafından kullanılan bir cihaz ağacı blob'u (DTB) olarak derlenir.

  • Çekirdek resmi sanal adresinin rastgele atanması. Önyükleyici, çekirdek resminin yüklendiği sanal adresin rastgele olmasını destekler. Adresi rastgele hale getirmek için çekirdek yapılandırmasında RANDOMIZE_BASE değerini true olarak ayarlayın. Bootloader, /chosen/kaslr-seed cihaz ağacı düğümüne rastgele bir u64 değeri ileterek entropi sağlamalıdır.

  • Doğrulanmış Başlatma. Doğrulanmış Başlatma, yükleyicinin tüm yürütülen kodların güvenilir bir kaynaktan geldiğinden emin olmasını sağlar.

  • Açılış yapılandırması Android 12 ve sonraki sürümlerde kullanılabilen boot config, yapılandırma ayrıntılarını derleme ve önyükleme yükleyiciden işletim sistemine aktaran bir mekanizmadır. Android 12'den önce androidboot ön ekiyle çekirdek komut satırı parametreleri kullanılır.

  • Kablosuz (OTA) güncellemeler. Sahadaki Android cihazlar, sistem, uygulama yazılımı ve saat dilimi kurallarına yönelik OTA güncellemelerini alıp yükleyebilir. Bu özelliğin, önyükleyici uygulamanız üzerinde etkileri vardır. OTA hakkında genel bilgi için OTA güncellemeleri başlıklı makaleyi inceleyin. Önyükleyiciye özel OTA uygulama ayrıntıları için OTA güncellemelerini destekleme başlıklı makaleyi inceleyin.

  • Sürüm bağlama. Sürüm bağlama, güvenlik anahtarlarını işletim sistemine ve yama düzeyi sürümüne bağlar. Sürüm bağlama, sistemin veya TEE yazılımının eski bir sürümünde zayıflık keşfeden bir saldırganın cihazı zayıf sürüme geri döndürememesini ve daha yeni sürümle oluşturulan anahtarları kullanamamasını sağlar. Bootloader, sürüm bağlamayı desteklemek için belirli bilgileri sağlamalıdır. Daha fazla bilgi için AVB mülklerindeki sürüm bilgileri başlıklı makaleyi inceleyin.

Çekirdek komut satırı

Aşağıdaki konumlardan çekirdek komut satırını birleştirin:

  • Önyükleme programı komut satırı: Önyükleme programı tarafından belirlenen statik ve dinamik parametre grubu

  • Cihaz ağacı: chosen/bootargs düğümünden

  • defconfig: CONFIG_CMDLINE

  • boot.img: Komut satırından (ofsetler ve boyutlar için system/core/mkbootimg/bootimg.h bölümüne bakın.

Android 12'den itibaren, Android kullanıcı alanına iletmemiz gereken androidboot.* parametreleri için çekirdek komut satırı yerine bootconfig kullanabiliriz.