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

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

मॉड्यूलर आयन हीप

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

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

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

लागू करना

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

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

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

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

ION User Space API (UAPI) हेडर में इस्तेमाल के लिए एक ion_heap_id enum शामिल है यह वेंडर हीप के ज़रिए इस्तेमाल करने के लिए हीप आईडी की रेंज तय करता है.

 /**
 * 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 तक).