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

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

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

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

  1. मेमोरी लोड और शुरू करना.

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

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

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

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

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

    1. कर्नेल को मेमोरी में, अपने-आप चलने वाले संपीड़ित बिटरी के तौर पर लोड करें. इसके बाद, कर्नेल अपने-आप डिकंप्रेस हो जाता है और मेमोरी में काम करना शुरू कर देता है.

    2. initramfs बनाने के लिए, रैम डिस्क और bootconfig सेक्शन को मेमोरी में लोड करें.

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

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

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

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

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

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

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

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

Kernel कमांड लाइन

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

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

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

  • defconfig: CONFIG_CMDLINE से

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

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