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

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

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

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

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

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

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

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

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

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

Kernel कमांड लाइन

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

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

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

  • defconfig: CONFIG_CMDLINE से

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

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