GKI के लिए ION हीप को मॉड्यूलराइज़ करें

कई Android OEM, ION कर्नेल ड्राइवर में कई वजहों से बदलाव करते हैं. जैसे, वेंडर हेप जोड़ना और कैश मेमोरी मैनेजमेंट को पसंद के मुताबिक बनाना. इन बदलावों के बारे में ज़्यादा जानने के लिए, ION मेमोरी ऐलोकेटर को इंटिग्रेट करना लेख पढ़ें. OEM, Generic Kernel Image (GKI) का इस्तेमाल करते समय, ऐसे बदलावों को बनाए रख सकें, इसके लिए Android Common Kernel v5.4 में एक फ़्रेमवर्क जोड़ा गया है. इस फ़्रेमवर्क की मदद से, वेंडर के हिसाब से ION हेप को मॉड्यूलर किया जा सकता है. साथ ही, इसमें कोर ION ड्राइवर पहले से मौजूद रहता है. नीचे दिए गए इलस्ट्रेशन में, कोर इमेज का लेआउट दिखाया गया है.

मॉड्यूलर ION हेप

पहली इमेज. मॉड्यूलराइज़्ड ION कर्नेल ड्राइवर

मॉड्यूलर ION हेप के ये फ़ायदे हैं.

  • ION कोर ड्राइवर, GKI इमेज का हिस्सा हो सकता है. इससे सभी डिवाइसों पर परफ़ॉर्मेंस को ऑप्टिमाइज़ करने और गड़बड़ियों को ठीक करने की सुविधा मिलती है.
  • सामान्य कर्नेल में ION कोर ड्राइवर हीप रजिस्ट्रेशन को मैनेज कर सकता है. साथ ही, यूज़रस्पेस और कर्नेल क्लाइंट के लिए इंटरफ़ेस को मैनेज कर सकता है. वेंडर हीप मॉड्यूल की ज़रूरत सिर्फ़ कस्टम हीप ऑपरेशन को लागू करने के लिए होती है.
  • GKI के हिस्से के तौर पर, ION कोर ड्राइवर में आसानी से मेमोरी इस्तेमाल की ट्रैकिंग के लिए हुक शामिल किए जा सकते हैं. जब हर OEM के पास ION ड्राइवर का अपना वर्शन होता था, तब ऐसा नहीं किया जा सकता था.
  • मॉड्यूलर वेंडर ION हेप की मदद से, आने वाले समय में dmabuf हेप पर ट्रांज़िशन करना आसान हो जाएगा.

लागू करना

ION हेप मॉड्यूल, अपने dmabuf ऑपरेशन रजिस्टर कर सकते हैं, ताकि कोर ION ड्राइवर से रजिस्टर किए गए ऑपरेशन को बदला जा सके. अगर ढेर के लागू होने में ज़रूरी बदलाव नहीं किए गए हैं, तो dmabuf कार्रवाई (जैसे कि get_flags()), जो मुख्य ION ड्राइवर के साथ काम नहीं करती है, तो -EOPNOTSUPP दिखाती है.

परफ़ॉर्मेंस को बेहतर बनाने के लिए, dmabuf ड्राइवर कुछ हद तक कैश मेमोरी का रखरखाव कर सकता है (चेंजलिस्ट देखें). कैश मेमोरी का कुछ हिस्सा ठीक से काम करने के लिए, कर्नेल क्लाइंट dma_buf_begin_cpu_access_partial और dma_buf_end_cpu_access_partial फ़ंक्शन इस्तेमाल कर सकते हैं.

Android Common Kernel में, सिस्टम और एक साथ मेमोरी को ऐलोकेट करने वाले (सीएमए) ढेर को मॉड्यूलर तरीके से लागू किया गया है. इसका इस्तेमाल, ढेर को मॉड्यूलर बनाने के लिए रेफ़रंस के तौर पर किया जाता है.

ION UAPI हेडर में बदलाव

ION यूज़र स्पेस एपीआई (यूएपीआई) हेडर में एक ion_heap_id एनम शामिल होता है. इसका इस्तेमाल, वेंडर हेप के इस्तेमाल के लिए, हेप आईडी की रेंज तय करने में किया जाता है.

 /**
 * ion_heap_id - list of heap IDs that Android can use
 *
 * @ION_HEAP_SYSTEM        ID for the ION_HEAP_TYPE_SYSTEM
 * @ION_HEAP_DMA_START     Start of reserved ID range for heaps of type ION_HEAP_TYPE_DMA
 * @ION_HEAP_DMA_END       End of reserved ID range for heaps of type ION_HEAP_TYPE_DMA
 * @ION_HEAP_CUSTOM_START  Start of reserved ID range for heaps of custom type
 * @ION_HEAP_CUSTOM_END    End of reserved ID range for heaps of custom type
 */

enum ion_heap_id {

   ION_HEAP_SYSTEM = (1 << ION_HEAP_TYPE_SYSTEM),

   ION_HEAP_DMA_START = (ION_HEAP_SYSTEM << 1),

   ION_HEAP_DMA_END = (ION_HEAP_DMA_START << 7),
   ION_HEAP_CUSTOM_START = (ION_HEAP_DMA_END << 1),

   ION_HEAP_CUSTOM_END = (ION_HEAP_CUSTOM_START << 22),
};

इसके अलावा, नए IOCTL (ION_IOC_ABI_VERSION) से उपयोगकर्ता स्पेस क्लाइंट को यह तय करने में मदद मिल सकती है कि मॉड्यूलर हेप का इस्तेमाल किया जा रहा है या नहीं.

सामान्य सिस्टम हीप को ओवरराइड किया जा रहा है

ION सिस्टम हेप, GKI इमेज का हिस्सा है और यह पहले से मौजूद होता है. इससे यह पक्का होता है कि किसी भी ऐसी सुविधा के लिए, जिसे सामान्य/डिवाइस पर निर्भर न करने वाली हेप का ऐक्सेस चाहिए, वह इस हेप के मौजूद होने पर ही काम कर सकती है. इसलिए, ION_HEAP_SYSTEM के हीप आईडी को बदला नहीं जा सकता. पसंद के मुताबिक सिस्टम हेप बनाने के लिए, कस्टम रेंज (ION_HEAP_CUSTOM_START से ION_HEAP_CUSTOM_END) में हेप आईडी का इस्तेमाल करके, एलोकेशन करें.