टैग किए गए पॉइंटर्स

एंड्रॉइड 11 में शुरू होकर, 64-बिट प्रक्रियाओं के लिए, सभी हीप आवंटन में एआरएम टॉप-बाइट इग्नोर (टीबीआई) के लिए कर्नेल समर्थन वाले उपकरणों पर पॉइंटर के शीर्ष बाइट में एक कार्यान्वयन परिभाषित टैग सेट होता है। इस टैग को संशोधित करने वाला कोई भी एप्लिकेशन तब समाप्त हो जाता है जब टैग को निरस्तीकरण के दौरान जांचा जाता है। एआरएम मेमोरी टैगिंग एक्सटेंशन (एमटीई) समर्थन वाले भविष्य के हार्डवेयर के लिए यह आवश्यक है।

शीर्ष-बाइट पर ध्यान न दें

ARM का टॉप-बाइट इग्नोर फीचर सभी Armv8 AArch64 हार्डवेयर में 64-बिट कोड के लिए उपलब्ध है। इस सुविधा का अर्थ है कि हार्डवेयर मेमोरी तक पहुँचते समय पॉइंटर के शीर्ष बाइट को अनदेखा कर देता है।

टीबीआई को एक संगत कर्नेल की आवश्यकता होती है जो उपयोगकर्ता स्थान से पारित टैग किए गए पॉइंटर्स को सही ढंग से संभालता है। 4.14 (पिक्सेल 4) और उच्चतर एंड्रॉइड कॉमन कर्नेल में आवश्यक टीबीआई पैच की सुविधा है।

कर्नेल में टीबीआई समर्थन वाले उपकरणों को प्रक्रिया प्रारंभ समय पर गतिशील रूप से पता लगाया जाता है और सभी ढेर आवंटन के लिए पॉइंटर के शीर्ष बाइट में एक कार्यान्वयन-निर्भर टैग डाला जाता है। इसके बाद, यह सुनिश्चित करने के लिए एक चेक चलाया जाता है कि मेमोरी को हटाते समय टैग को छोटा नहीं किया गया है।

मेमोरी टैगिंग एक्सटेंशन तत्परता

एआरएम का मेमोरी टैगिंग एक्सटेंशन (एमटीई) मेमोरी सुरक्षा समस्याओं का समाधान करने में मदद करता है। एमटीई स्टैक, हीप और ग्लोबल्स पर प्रत्येक मेमोरी आवंटन के 56वें-59वें एड्रेस बिट्स को टैग करके काम करता है। हार्डवेयर और निर्देश सेट स्वचालित रूप से जाँचता है कि प्रत्येक मेमोरी एक्सेस पर सही टैग का उपयोग किया गया है।

एंड्रॉइड ऐप जो पॉइंटर के शीर्ष बाइट में गलत तरीके से जानकारी संग्रहीत करते हैं , उन्हें एमटीई-सक्षम डिवाइस पर ब्रेक की गारंटी दी जाती है। टैग किए गए पॉइंटर्स एमटीई डिवाइस उपलब्ध होने से पहले पॉइंटर के शीर्ष बाइट के गलत उपयोग का पता लगाना और अस्वीकार करना आसान बनाते हैं।

डेवलपर समर्थन

यदि आपका ऐप क्रैश हो गया है और आपको यह लिंक पूछा गया है, तो इसका मतलब निम्न में से एक हो सकता है:

  1. एप्लिकेशन ने एक पॉइंटर को मुक्त करने का प्रयास किया जो सिस्टम के हीप एलोकेटर द्वारा आवंटित नहीं किया गया था।
  2. आपके ऐप में किसी चीज़ ने पॉइंटर के शीर्ष बाइट को संशोधित किया है। पॉइंटर के शीर्ष बाइट को संशोधित नहीं किया जा सकता है और इस समस्या को ठीक करने के लिए आपके कोड को बदलने की आवश्यकता है।

शीर्ष बाइट पॉइंटर के गलत तरीके से उपयोग या संशोधित किए जाने के उदाहरण।

  • किसी विशेष प्रकार के पॉइंटर्स में एप्लिकेशन विशिष्ट मेटाडेटा शीर्ष 16 एड्रेस बिट्स में संग्रहीत होता है।
  • एक सूचक को दोगुना किया जाता है और फिर वापस किया जाता है, जिससे निम्न पता बिट्स खो जाते हैं।
  • रिकर्सन गहराई को मापने के तरीके के रूप में विभिन्न स्टैक फ़्रेमों से स्थानीय चर के पतों के बीच अंतर की गणना करने वाला कोड।

कुछ एप्लिकेशन लाइब्रेरीज़ पर निर्भर हो सकते हैं जो पॉइंटर की शीर्ष बाइट सेट होने पर गलत तरीके से व्यवहार करते हैं। हम मानते हैं कि पुस्तकालयों में इन अंतर्निहित समस्याओं को शीघ्रता से ठीक करना गैर-तुच्छ हो सकता है। इस प्रकार, जो एप्लिकेशन targetSdkLevel < 30 का उपयोग करते हैं उनमें डिफ़ॉल्ट रूप से पॉइंटर टैगिंग सक्षम नहीं होगी। हम संक्रमणकालीन अवधि को आसान बनाने के लिए targetSdkLevel >= 30 के साथ निर्मित अनुप्रयोगों के लिए एक एस्केप हैच भी प्रदान करते हैं।

एस्केप हैच का उपयोग आपकी AndroidManifest.xml फ़ाइल में निम्नलिखित जोड़कर किया जाता है:

  <application android:allowNativeHeapPointerTagging="false">
  ...
  </application>

यह आपके एप्लिकेशन के लिए पॉइंटर टैगिंग सुविधा को अक्षम कर देगा। कृपया ध्यान दें कि यह अंतर्निहित कोड स्वास्थ्य समस्या का समाधान नहीं करता है। यह एस्केप हैच एंड्रॉइड के भविष्य के संस्करणों में गायब हो जाएगा, क्योंकि इस प्रकृति के मुद्दे एमटीई के साथ असंगत होंगे।