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

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

टॉप-बाइट इग्नोर

एआरएम की टॉप-बाइट इग्नोर सुविधा सभी आर्मव8 एएआरसीएच64 हार्डवेयर में 64-बिट कोड के लिए उपलब्ध है। इस फीचर का मतलब है कि मेमोरी एक्सेस करते समय हार्डवेयर पॉइंटर के टॉप बाइट को इग्नोर कर देता है।

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

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

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

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

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

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

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

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

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

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

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

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

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

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