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