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

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

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

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

TBI एक आवश्यकता हैसंगत गिरी कि सही ढंग से हैंडल में चिह्नित संकेत यूज़रस्पेस से पारित कर दिया। 4.14 से एंड्रॉयड आम गुठली (पिक्सेल 4) और उच्च सुविधा के लिए आवश्यक TBI पैच

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

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

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

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

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

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

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

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

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

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

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

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

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