इस पेज का अनुवाद Cloud Translation API से किया गया है.
Switch to English

टैग की गईं संकेत

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

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

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

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

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

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

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

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

डेवलपर समर्थन करते हैं

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

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

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

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

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

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

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

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