जीकेआई के लिए मॉड्यूलराइजिंग आईओएन हीप्स

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

मॉड्यूलर आयन ढेर

चित्र 1. मॉड्यूलरीकृत ION कर्नेल ड्राइवर

मॉड्यूलर ION हीप्स के निम्नलिखित फायदे हैं।

  • ION कोर ड्राइवर GKI छवि का हिस्सा हो सकता है, जो सभी डिवाइस-स्वतंत्र प्रदर्शन अनुकूलन और बग फिक्स को सभी डिवाइस तक पहुंचने में सक्षम बनाता है।
  • सामान्य कर्नेल में ION कोर ड्राइवर हीप पंजीकरण को संभाल सकता है और यूजरस्पेस और कर्नेल क्लाइंट के लिए इंटरफ़ेस का प्रबंधन कर सकता है। विक्रेता हीप मॉड्यूल की आवश्यकता केवल कस्टम हीप संचालन को लागू करने के लिए होती है।
  • ION कोर ड्राइवर (GKI के भाग के रूप में) में आसान मेमोरी उपयोग ट्रैकिंग के लिए हुक शामिल हो सकते हैं, जो तब संभव नहीं था जब प्रत्येक OEM के पास ION ड्राइवर का अपना संस्करण था।
  • मॉड्यूलर विक्रेता ION हीप्स को भविष्य में dmabuf हीप्स में किसी भी बदलाव को आसान बनाना चाहिए।

क्रियान्वयन

ION हीप मॉड्यूल कोर ION ड्राइवर द्वारा पंजीकृत लोगों को ओवरराइड करने के लिए अपने स्वयं के dmabuf संचालन को पंजीकृत कर सकते हैं। एक dmabuf ऑपरेशन (जैसे get_flags() ) जो कोर ION ड्राइवर द्वारा समर्थित नहीं है, यदि हीप कार्यान्वयन में आवश्यक ओवरराइड का अभाव है, तो -EOPNOTSUPP लौटाता है।

प्रदर्शन में सुधार करने के लिए, dmabuf ड्राइवर आंशिक कैश रखरखाव कर सकता है ( चेंजलिस्ट देखें)। आंशिक कैश रखरखाव करने के लिए कर्नेल क्लाइंट dma_buf_begin_cpu_access_partial और dma_buf_end_cpu_access_partial फ़ंक्शन का उपयोग कर सकते हैं।

एंड्रॉइड कॉमन कर्नेल में सिस्टम के मॉड्यूलर कार्यान्वयन और हीप मॉड्यूलराइजेशन के संदर्भ के रूप में उपयोग के लिए सन्निहित मेमोरी एलोकेटर (सीएमए) हीप्स शामिल हैं।

ION UAPI हेडर में परिवर्तन

ION यूजर स्पेस एपीआई (UAPI) हेडर में विक्रेता हीप्स द्वारा उपयोग के लिए हीप आईडी की एक श्रृंखला को परिभाषित करने में उपयोग के लिए एक 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 ) में हीप आईडी का उपयोग करें।