कर्नेल 4.14 और उच्चतर शिपिंग करने वाले उपकरण आयन कर्नेल मॉड्यूल के एक प्रमुख रीफैक्टरिंग से प्रभावित होते हैं, जिसे कई विक्रेता ग्राफिक्स मेमोरी एलोकेटर (ग्रालोक) हार्डवेयर एब्स्ट्रैक्शन लेयर (एचएएल) कार्यान्वयन साझा मेमोरी बफ़र्स आवंटित करने के लिए कॉल करते हैं। यह आलेख विरासत विक्रेता कोड को आयन के नए संस्करण में स्थानांतरित करने पर मार्गदर्शन प्रदान करता है और संभावित भविष्य के एप्लिकेशन बाइनरी इंटरफ़ेस (एबीआई) ब्रेक पर चर्चा करता है।
आयन के बारे में
आयन अपस्ट्रीम कर्नेल के कार्य-प्रगति स्टेजिंग ट्री का हिस्सा है। स्टेजिंग के दौरान, आयन का यूजरस्पेस-टू-कर्नेल एबीआई प्रमुख कर्नेल संस्करणों के बीच टूट सकता है। जबकि आयन एबीआई ब्रेक सीधे सामान्य अनुप्रयोगों या पहले से लॉन्च किए गए डिवाइसों को प्रभावित नहीं करते हैं , नए प्रमुख कर्नेल संस्करणों में माइग्रेट करने वाले विक्रेताओं को उन परिवर्तनों का सामना करना पड़ सकता है जो आयन में विक्रेता कोड कॉलिंग को प्रभावित करते हैं। इसके अतिरिक्त, भविष्य में एबीआई ब्रेक हो सकता है क्योंकि एंड्रॉइड सिस्टम टीम आयन को स्टेजिंग ट्री से बाहर ले जाने के लिए अपस्ट्रीम के साथ काम करती है।
एंड्रॉइड-4.14 में परिवर्तन
कर्नेल 4.12 ने आयन कर्नेल कोड को बड़े पैमाने पर दोबारा तैयार किया, अन्य कर्नेल फ्रेमवर्क के साथ ओवरलैप होने वाले आयन के हिस्सों को साफ किया और हटा दिया। परिणामस्वरूप, कई लीगेसी आयन ioctls अब प्रासंगिक नहीं हैं और उन्हें हटा दिया गया है।
आयन क्लाइंट और हैंडल को हटाना
कर्नेल 4.12 से पहले, /dev/ion
खोलने पर एक आयन क्लाइंट आवंटित किया जाता था। ION_IOC_ALLOC
ioctl ने एक नया बफ़र आवंटित किया और इसे आयन हैंडल के रूप में उपयोगकर्ता स्थान पर लौटा दिया (एक अपारदर्शी पूर्णांक जो केवल इसे आवंटित करने वाले आयन क्लाइंट के लिए सार्थक है)। बफ़र्स को उपयोगकर्ता स्थान में मैप करने या उन्हें अन्य प्रक्रियाओं के साथ साझा करने के लिए, आयन हैंडल को ION_IOC_SHARE
ioctl का उपयोग करके dma-buf fds के रूप में पुनः निर्यात किया गया था।
कर्नेल 4.12 में, ION_IOC_ALLOC
ioctl सीधे dma-buf fds आउटपुट करता है। मध्यवर्ती आयन हैंडल स्थिति को उन सभी ioctls के साथ हटा दिया गया है जो आयन हैंडल का उपभोग या उत्पादन करते हैं। क्योंकि dma-buf fds विशिष्ट आयन क्लाइंट से बंधे नहीं हैं, ION_IOC_SHARE
ioctl की अब आवश्यकता नहीं है, और सभी आयन क्लाइंट इंफ्रास्ट्रक्चर को हटा दिया गया है।
कैश-सुसंगतता ioctls का जोड़
कर्नेल 4.12 से पहले, आयन ने फ़ाइल डिस्क्रिप्टर को मेमोरी के साथ सिंक्रनाइज़ करने के लिए एक ION_IOC_SYNC
ioctl प्रदान किया था। यह ioctl खराब ढंग से प्रलेखित और अनम्य था। परिणामस्वरूप, कई विक्रेताओं ने कैश रखरखाव करने के लिए कस्टम ioctls लागू किया।
कर्नेल 4.12 ने ION_IOC_SYNC
linux/dma-buf.h में परिभाषित DMA_BUF_IOCTL_SYNC ioctl
से बदल दिया। प्रत्येक सीपीयू एक्सेस के आरंभ और अंत में DMA_BUF_IOCTL_SYNC
पर कॉल करें, फ़्लैग के साथ यह निर्दिष्ट करें कि ये एक्सेस पढ़े और/या लिखे गए हैं या नहीं। हालाँकि DMA_BUF_IOCTL_SYNC
, ION_IOC_SYNC
की तुलना में अधिक क्रियात्मक है, यह उपयोगकर्ता स्थान को अंतर्निहित कैश रखरखाव कार्यों पर अधिक नियंत्रण देता है।
DMA_BUF_IOCTL_SYNC
कर्नेल के स्थिर ABI का हिस्सा है और सभी dma-buf fds के साथ प्रयोग करने योग्य है, चाहे उन्हें आयन द्वारा आवंटित किया गया हो या नहीं।
विक्रेता कोड को एंड्रॉइड-4.12+ पर माइग्रेट किया जा रहा है
यूजरस्पेस क्लाइंट के लिए, एंड्रॉइड सिस्टम टीम ओपन-कोडिंग ioctl()
कॉल के बजाय libion का उपयोग करने को दृढ़ता से प्रोत्साहित करती है। एंड्रॉइड 9 के अनुसार, लिबियन स्वचालित रूप से रनटाइम पर आयन एबीआई का पता लगाता है और कर्नेल के बीच किसी भी अंतर को छिपाने का प्रयास करता है। हालाँकि, ion_user_handle_t
हैंडल का उत्पादन या उपभोग करने वाला कोई भी libion फ़ंक्शन कर्नेल 4.12 के बाद काम नहीं करता है। आप इन फ़ंक्शंस को dma-buf fds पर निम्नलिखित समतुल्य परिचालनों से बदल सकते हैं, जो आज तक कर्नेल के सभी संस्करणों पर काम करते हैं।
लीगेसी आयन_यूजर_हैंडल_टी कॉल | समतुल्य डीएमए-बफ एफडी कॉल |
---|---|
ion_alloc(ion_fd, …, &buf_handle) | ion_alloc_fd(ion_fd, ..., &buf_fd) |
ion_share(ion_fd, buf_handle, &buf_fd) | एन/ए (डीएमए-ब्यूएफ एफडीएस के साथ इस कॉल की आवश्यकता नहीं है) |
ion_map(ion_fd, buf_handle, ...) | mmap(buf_fd, ...) |
ion_free(ion_fd, buf_handle) | close(buf_fd) |
ion_import(ion_fd, buf_fd, &buf_handle) | एन/ए (डीएमए-ब्यूएफ एफडीएस के साथ इस कॉल की आवश्यकता नहीं है) |
ion_sync_fd(ion_fd, buf_fd) | If (ion_is_legacy(ion_fd)) |
इन-कर्नेल क्लाइंट के लिए, क्योंकि आयन अब किसी भी कर्नेल-फेसिंग एपीआई को निर्यात नहीं करता है, जो ड्राइवर पहले ion_import_dma_buf_fd()
के साथ इन-कर्नेल आयन कर्नेल एपीआई का उपयोग करते थे, उन्हें dma_buf_get()
के साथ इन-कर्नेल डीएमए-ब्यूफ एपीआई का उपयोग करने के लिए परिवर्तित किया जाना चाहिए।
भविष्य आयन एबीआई टूट जाता है
इससे पहले कि आयन को स्टेजिंग ट्री से बाहर ले जाया जा सके, भविष्य में कर्नेल रिलीज़ को आयन एबीआई को फिर से तोड़ने की आवश्यकता हो सकती है। एंड्रॉइड सिस्टम टीम को उम्मीद नहीं है कि इन बदलावों से अगले एंड्रॉइड वर्जन के साथ लॉन्च होने वाले डिवाइस प्रभावित होंगे, लेकिन ऐसे बदलाव बाद के एंड्रॉइड वर्जन के साथ लॉन्च होने वाले डिवाइसों को प्रभावित कर सकते हैं।
उदाहरण के लिए, अपस्ट्रीम समुदाय ने एकल /dev/ion
नोड को कई, प्रति-हीप नोड्स (उदाहरण के लिए, /dev/ion/heap0
) में विभाजित करने का प्रस्ताव दिया है ताकि डिवाइस प्रत्येक ढेर पर अलग-अलग SELinux नीतियों को लागू करने में सक्षम हो सकें। यदि यह परिवर्तन भविष्य के कर्नेल रिलीज़ में लागू किया जाता है, तो यह आयन एबीआई को तोड़ देगा।