बूटलोडर के बारे में खास जानकारी

बूटलोडर, वेंडर के मालिकाना हक वाली इमेज होती है. यह डिवाइस पर कर्नल को चालू करने के लिए ज़िम्मेदार होती है. बूटलोडर, डिवाइस की स्थिति की सुरक्षा करता है. साथ ही, ट्रस्टेड एक्ज़ीक्यूशन एनवायरमेंट (टीईई) को शुरू करने और इसके रूट ऑफ़ ट्रस्ट को बाइंड करने की ज़िम्मेदारी भी इसी की होती है. बूटलोडर, कर्नल को एक्ज़ीक्यूशन ट्रांसफ़र करने से पहले, boot और recovery पार्टीशन के रखरखाव की पुष्टि भी करता है.

बूटलोडर फ़्लो का उदाहरण

यहां बूटलोडर के फ़्लो का एक उदाहरण दिया गया है:

  1. मेमोरी को लोड और शुरू करता है.

  2. वेरीफ़ाइड बूट फ़्लो के मुताबिक, डिवाइस की पुष्टि करें.

  3. वेरिफ़ाइड बूट की प्रोसेस के मुताबिक, बूट पार्टिशन की पुष्टि करें. इनमें boot, dtbo, init_boot, और recovery शामिल हैं. इस चरण के तहत, बूट इमेज हेडर का वर्शन देखें और हेडर को उसके हिसाब से पार्स करें.

  4. अगर A/B अपडेट का इस्तेमाल किया जाता है, तो बूट करने के लिए मौजूदा स्लॉट तय करें.

  5. इससे यह तय होता है कि रिकवरी मोड को बूट करना चाहिए या नहीं. ज़्यादा जानकारी के लिए, OTA अपडेट की सुविधा लेख पढ़ें.

  6. बूट इमेज लोड करें. जैसे, boot.img, vendor_boot.img, init_boot.img, और वेंडर की अन्य मालिकाना हक वाली बूट इमेज. इन बूट इमेज में कर्नल और रैमडिस्क इमेज शामिल होती हैं.

    1. इस विकल्प का इस्तेमाल करके, कर्नल को मेमोरी में लोड किया जाता है. यह एक ऐसा कंप्रेस किया गया बाइनरी फ़ाइल होती है जिसे खुद ही चलाया जा सकता है. इसके बाद, कर्नल खुद को डीकंप्रेस करता है और मेमोरी में एक्ज़ीक्यूट होना शुरू हो जाता है.

    2. initramfs बनाने के लिए, रैमडिस्क और बूट कॉन्फ़िगरेशन सेक्शन को मेमोरी में लोड करें.

बूटलोडर से जुड़ी अन्य सुविधाएं

बूटलोडर से जुड़ी अन्य सुविधाओं की सूची यहां दी गई है. इन्हें लागू किया जा सकता है:

  • डिवाइस ट्री ओवरले (डीटीओ). डिवाइस ट्री ओवरले की मदद से बूटलोडर, अलग-अलग हार्डवेयर कॉन्फ़िगरेशन को सपोर्ट कर पाता है. डीटीओ को डिवाइस ट्री ब्लॉब (डीटीबी) में कंपाइल किया जाता है. इसका इस्तेमाल बूटलोडर करता है.

  • कर्नेल इमेज के वर्चुअल पते को रैंडमाइज़ करना. बूटलोडर, उस वर्चुअल पते को रैंडमाइज़ करने की सुविधा देता है जिस पर कर्नल इमेज लोड होती है. पते को रैंडमाइज़ करने के लिए, कर्नल कॉन्फ़िगरेशन में RANDOMIZE_BASE को true पर सेट करें. बूटलोडर को एंट्रॉपी उपलब्ध करानी होगी. इसके लिए, उसे /chosen/kaslr-seed डिवाइस ट्री नोड में u64 की कोई रैंडम वैल्यू पास करनी होगी.

  • वेरिफ़ाइड बूट. वेरिफ़ाइड बूट की मदद से बूटलोडर यह पक्का कर सकता है कि चलाया गया सभी कोड, भरोसेमंद सोर्स से आया हो.

  • बूट कॉन्फ़िगरेशन. बूट कॉन्फ़िगरेशन, Android 12 और उसके बाद के वर्शन में उपलब्ध है. यह एक ऐसा तरीका है जिससे कॉन्फ़िगरेशन की जानकारी, बिल्ड और बूटलोडर से ऑपरेटिंग सिस्टम तक पहुंचाई जाती है. Android 12 से पहले, androidboot प्रीफ़िक्स वाले कर्नेल कमांड-लाइन पैरामीटर का इस्तेमाल किया जाता था.

  • ओवर-द-एयर (ओटीए) अपडेट. फ़ील्ड में मौजूद Android डिवाइसों को सिस्टम, ऐप्लिकेशन सॉफ़्टवेयर, और टाइम ज़ोन के नियमों के लिए, ओटीए अपडेट मिल सकते हैं और उन्हें इंस्टॉल किया जा सकता है. इस सुविधा का असर, बूटलोडर लागू करने पर पड़ता है. ओटीए के बारे में सामान्य जानकारी के लिए, ओटीए अपडेट देखें. बूटलोडर के लिए, OTA अपडेट लागू करने के बारे में जानकारी पाने के लिए, OTA अपडेट की सुविधा चालू करना लेख पढ़ें.

  • वर्शन बाइंडिंग. वर्शन बाइंडिंग, सुरक्षा कुंजियों को ऑपरेटिंग सिस्टम और पैच लेवल वर्शन से बाइंड करती है. वर्शन बाइंडिंग यह पक्का करती है कि सिस्टम या टीईई सॉफ़्टवेयर के पुराने वर्शन में कोई गड़बड़ी ढूंढने वाला हमलावर, डिवाइस को गड़बड़ी वाले वर्शन पर रोल बैक न कर पाए. साथ ही, वह नए वर्शन से बनाई गई कुंजियों का इस्तेमाल न कर पाए. वर्शन बाइंडिंग की सुविधा के लिए, बूटलोडर को कुछ जानकारी देनी होगी. ज़्यादा जानकारी के लिए, एवीबी प्रॉपर्टी में वर्शन की जानकारी देखें.

कर्नेल कमांड लाइन

इन जगहों से कर्नल कमांड लाइन को जोड़ें:

  • बूटलोडर कमांड लाइन: बूटलोडर के तय किए गए स्टैटिक और डाइनैमिक पैरामीटर का सेट

  • डिवाइस ट्री: chosen/bootargs नोड से

  • defconfig: CONFIG_CMDLINE से

  • boot.img: कमांड लाइन से (ऑफ़सेट और साइज़ के लिए, system/core/mkbootimg/bootimg.h देखें)

Android 12 से, Android यूज़रस्पेस को पास किए जाने वाले androidboot.* पैरामीटर के लिए, कर्नेल कमांड लाइन के बजाय bootconfig का इस्तेमाल किया जा सकता है.