GKI मॉड्यूल के तौर पर, kernel की सुविधाओं को कॉन्फ़िगर करना

इस पेज पर, नई कर्नल सुविधा को जीकेआई मॉड्यूल के तौर पर कॉन्फ़िगर करने या पहले से मौजूद बिल्ट-इन कर्नल सुविधा को जीकेआई मॉड्यूल के तौर पर कॉन्फ़िगर करने का तरीका बताया गया है.

नई सुविधा को GKI मॉड्यूल के तौर पर कॉन्फ़िगर करना

  1. नई सुविधा के लिए, gki_defconfig में बदलाव करें और n से m (=m) तक, कर्नल की ज़रूरी सुविधा का कॉन्फ़िगरेशन आइटम सेट करें. इस सेटिंग को arch/arm64/configs/gki_defconfig और arch/x86/configs/gki_defconfig, दोनों में सेट करें.

  2. इस सुविधा के लिए जनरेट की गई KO (.ko) फ़ाइलों को यहां दी गई फ़ाइल के _COMMON_GKI_MODULES_LIST सेक्शन में जोड़ें. फ़ाइलों को क्रम से जोड़ें. अगर आपको जनरेट की गई सभी फ़ाइलों के बारे में पक्का नहीं है, तो बिल्ड नहीं हो पाएगा. साथ ही, सूची में जोड़ी जाने वाली सभी ज़रूरी KO फ़ाइलों की सूची दिखेगी.

    • android17-6.18 और इसके बाद के वर्शन में, आइटम को common/bazel/modules_private.bzl में जोड़ें.
    • android16-6.12 और इससे पहले के वर्शन में, आइटम को common/modules.bzl में जोड़ें.
  3. Android 14 के लिए, चरण 2 में दिए गए KO फ़ाइलों के उसी सेट को common/android/gki_{ARCH}_protected_modules में जोड़ें. इन फ़ाइलों को रनटाइम पर बाइनरी सर्च के लिए, बढ़ते क्रम में क्रम से लगाएं, ताकि मॉड्यूल को सुरक्षित जीकेआई मॉड्यूल के तौर पर सेट किया जा सके.

  4. Android 14 और 15 के लिए, एक्सपोर्ट की सूची को अपडेट करें, ताकि इसमें common/android/abi_gki_protected_exports_ARCHITECTURE में जोड़े गए नए एक्सपोर्ट शामिल हों. उदाहरण के लिए, सूची को अपडेट करने के लिए, tools/bazel run //common:kernel_aarch64_abi_update_protected_exports for aarch64 चलाएं.

  5. पक्का करें कि दूसरे चरण में जोड़ी गई नई KO फ़ाइलें, कर्नल के out/<androidX-Y.Z>/dist/system_dlkm.img और out/androidX-Y.Z/dist/system_dlkm_staging_archive.tar.gz में कॉपी की गई हों. system_dlkm_staging_archive.tar.gz के आर्काइव में मौजूद मॉड्यूल का इस्तेमाल, प्लैटफ़ॉर्म बिल्ड में system_dlkm.img जनरेट करने के लिए इनपुट के तौर पर किया जा सकता है.

  6. अपने बदलावों को समीक्षा के लिए भेजें. जीकेआई मॉड्यूल, Android के लिए उपलब्ध कर्नेल की सुविधा है. इसलिए, मॉड्यूल कन्वर्ज़न पैच को अपस्ट्रीम में सबमिट करने की ज़रूरत नहीं होती. हालांकि, Android Common Kernel (ACK) पैच सबमिट करने के लिए, आपको अन्य दिशा-निर्देशों का पालन करना होगा.

कर्नेल में पहले से मौजूद सुविधा को जीकेआई मॉड्यूल के तौर पर कॉन्फ़िगर करना

  1. पहले से मौजूद बिल्ट-इन कर्नल सुविधा के लिए, gki_defconfig में बदलाव करें. इसके बाद, ज़रूरी कर्नल सुविधा के कॉन्फ़िगरेशन आइटम को y से m (=m) पर सेट करें. इस सेटिंग को arch/arm64/configs/gki_defconfig और arch/x86/configs/gki_defconfig, दोनों में सेट करें.

  2. सुविधा के लिए जनरेट की गई KO (.ko) फ़ाइलों को, यहां दी गई फ़ाइल के _COMMON_GKI_MODULES_LIST सेक्शन में जोड़ें. फ़ाइलों को क्रम से लगाएं. अगर आपको जनरेट की गई सभी फ़ाइलों के बारे में पक्का नहीं है, तो बिल्ड नहीं हो पाएगा. साथ ही, सूची में जोड़ी जाने वाली सभी ज़रूरी KO फ़ाइलों की सूची दिखेगी.

    • android17-6.18 और इसके बाद के वर्शन में, आइटम को common/bazel/modules_private.bzl में जोड़ें.
    • android16-6.12 और इससे पहले के वर्शन में, `common/modules.bzl` में आइटम जोड़ें.
  3. Android 14 के लिए, चरण 2 में दिए गए KO फ़ाइलों के उसी सेट को common/android/gki_{ARCH}_protected_modules में जोड़ें. इन फ़ाइलों को रनटाइम पर बाइनरी सर्च के लिए, बढ़ते क्रम में क्रम से लगाएं, ताकि मॉड्यूल को सुरक्षित जीकेआई मॉड्यूल के तौर पर सेट किया जा सके.

  4. Android 14 और 15 के लिए, सुरक्षित किए गए एक्सपोर्ट की सूची अपडेट करें. इसमें common/android/abi_gki_protected_exports_{ARCH} में जोड़े गए नए मॉड्यूल से एक्सपोर्ट शामिल करें. इसके लिए, aarch64 के लिए tools/bazel run //common:kernel_aarch64_abi_update_protected_exports का इस्तेमाल करें.

  5. पक्का करें कि दूसरे चरण में बदली गई नई मॉड्यूल KO फ़ाइलों को कर्नल के out/<androidX-Y.Z>/dist/system_dlkm.img और out/androidX-Y.Z/dist/system_dlkm_staging_archive.tar.gz में कॉपी किया गया हो. system_dlkm_staging_archive.tar.gz के आर्काइव में मौजूद मॉड्यूल का इस्तेमाल, प्लैटफ़ॉर्म बिल्ड में system_dlkm.img जनरेट करने के लिए इनपुट के तौर पर किया जा सकता है.

  6. अपने बदलावों को समीक्षा के लिए भेजें. जीकेआई मॉड्यूल, Android के लिए उपलब्ध कर्नेल की सुविधा है. इसलिए, मॉड्यूल कन्वर्ज़न पैच को अपस्ट्रीम में सबमिट करने की ज़रूरत नहीं होती. हालांकि, Android Common Kernel (ACK) पैच सबमिट करने के लिए, आपको अन्य दिशा-निर्देशों का पालन करना होगा.

सुरक्षित GKI मॉड्यूल को असुरक्षित में बदलना

  1. Android 15 और इसके बाद के वर्शन के लिए, सुरक्षित से असुरक्षित में बदले जा रहे मॉड्यूल को _COMMON_UNPROTECTED_MODULES_LIST सूची में जोड़ें. यह सूची इस फ़ाइल में मौजूद है:

    • android17-6.18 और इसके बाद के वर्शन में, आइटम को common/bazel/modules_private.bzl में जोड़ें.
    • android16-6.12 और इससे पहले के वर्शन में, आइटम को common/modules.bzl में जोड़ें.
  2. Android 14 के लिए, सुरक्षित से असुरक्षित में बदले जा रहे मॉड्यूल को common/android/gki_protected_modules पर मौजूद सुरक्षित मॉड्यूल की सूची से हटाएं.

  3. Android 14 और 15 के लिए, सुरक्षित किए गए एक्सपोर्ट की सूची को अपडेट करें. ऐसा करने के लिए, common/android/abi_gki_protected_exports_{ARCH} में मौजूद, हाल ही में बदले गए असुरक्षित मॉड्यूल से एक्सपोर्ट को हटाएं. इसके लिए, aarch64 के लिए tools/bazel run //common:kernel_aarch64_abi_update_protected_exports का इस्तेमाल करें.

  4. अपने बदलावों को समीक्षा के लिए भेजें. जीकेआई मॉड्यूल, Android के लिए उपलब्ध कर्नेल की सुविधा है. इसलिए, मॉड्यूल कन्वर्ज़न पैच को अपस्ट्रीम में सबमिट करने की ज़रूरत नहीं होती. हालांकि, Android Common Kernel (ACK) पैच सबमिट करने के लिए, आपको अन्य दिशा-निर्देशों का पालन करना होगा.

GKI मॉड्यूल के सिंबल से जुड़े उल्लंघन को ठीक करने के बारे में क्विक गाइड

जब बिना हस्ताक्षर वाले मॉड्यूल, GKI मॉड्यूल के लिए लागू सिंबल सुरक्षा का उल्लंघन करते हैं, तो मॉड्यूल लोड करने के दौरान दो तरह की गड़बड़ियां हो सकती हैं. इस वजह से, मॉड्यूल लोड नहीं हो पाता.

1. सुरक्षित सिंबल का इस्तेमाल करने वाला बिना हस्ताक्षर किया गया मॉड्यूल

गड़बड़ी:

module: Protected symbol: some_kernel_function (err -13)

वजह:

module.ko फ़ाइल, बिना हस्ताक्षर वाला वेंडर मॉड्यूल है. यह वेंडर सिंबल की सूची में शामिल हुए बिना, लोड होने के दौरान GKI मॉड्यूल के एक्सपोर्ट किए गए सिंबल some_kernel_function को ठीक करने की कोशिश करता है.

समस्या हल करने का तरीका:

अगर module.ko एक सुरक्षित GKI मॉड्यूल नहीं है, तो सिंबल की सूची को अपडेट करने से गड़बड़ी ठीक हो जाती है. इसके लिए, वेंडर सिंबल की सूची में some_kernel_function को शामिल किया जाता है. इसके अलावा, module.ko के GKI वर्शन का इस्तेमाल करें.

2. बिना हस्ताक्षर वाला मॉड्यूल, सुरक्षित किए गए सिंबल को एक्सपोर्ट कर रहा है

गड़बड़ी:

module: exports protected symbol some_kernel_function

वजह:

some_kernel_function को एक्सपोर्ट करने वाला मॉड्यूल, सुरक्षित जीकेआई मॉड्यूल है. साथ ही, some_kernel_function उस मॉड्यूल का बिना हस्ताक्षर किया गया कस्टम वर्शन है.module.ko जब module.ko, some_kernel_function को एक्सपोर्ट करने की कोशिश करता है, तब यह मैसेज दिखता है. some_kernel_function को सिर्फ़ साइन किए गए जीकेआई मॉड्यूल से एक्सपोर्ट किया जा सकता है.

समस्या हल करने का तरीका:

अगर बिना हस्ताक्षर वाला मॉड्यूल, कस्टम वर्शन है, तो some_kernel_function एक्सपोर्ट करने वाले मॉड्यूल के GKI वर्शन का इस्तेमाल करके, इस समस्या को ठीक किया जा सकता है.