एवीएफ वास्तुकला

एंड्रॉइड, एंड्रॉइड वर्चुअलाइजेशन फ्रेमवर्क को लागू करने के लिए आवश्यक सभी घटकों का एक संदर्भ कार्यान्वयन प्रदान करता है। वर्तमान में यह कार्यान्वयन ARM64 तक सीमित है। यह पेज फ्रेमवर्क आर्किटेक्चर की व्याख्या करता है।

पृष्ठभूमि

आर्म आर्किटेक्चर चार अपवाद स्तरों तक की अनुमति देता है, अपवाद स्तर 0 (ईएल0) सबसे कम विशेषाधिकार प्राप्त है, और अपवाद स्तर 3 (ईएल3) सबसे अधिक है। एंड्रॉइड कोडबेस का सबसे बड़ा हिस्सा (सभी यूजरस्पेस घटक) EL0 पर चलता है। बाकी जिसे आमतौर पर "एंड्रॉइड" कहा जाता है वह लिनक्स कर्नेल है, जो EL1 पर चलता है।

EL2 परत एक हाइपरवाइज़र की शुरूआत की अनुमति देती है जो मजबूत गोपनीयता और अखंडता की गारंटी के साथ मेमोरी और डिवाइस को EL1/EL0 पर अलग-अलग pVM में अलग करने में सक्षम बनाता है।

सूत्र

संरक्षित कर्नेल-आधारित वर्चुअल मशीन (पीकेवीएम) लिनक्स केवीएम हाइपरवाइजर पर बनाई गई है, जिसे निर्माण के समय 'संरक्षित' के रूप में चिह्नित अतिथि वर्चुअल मशीनों में चल रहे पेलोड तक पहुंच को प्रतिबंधित करने की क्षमता के साथ बढ़ाया गया है।

KVM/arm64 कुछ सीपीयू सुविधाओं, अर्थात् वर्चुअलाइजेशन होस्ट एक्सटेंशन (VHE) (ARMv8.1 और बाद के संस्करण) की उपलब्धता के आधार पर विभिन्न निष्पादन मोड का समर्थन करता है। उन मोडों में से एक में, जिसे आमतौर पर गैर-वीएचई मोड के रूप में जाना जाता है, हाइपरवाइज़र कोड बूट के दौरान कर्नेल छवि से अलग हो जाता है और EL2 पर स्थापित होता है, जबकि कर्नेल स्वयं EL1 पर चलता है। हालांकि लिनक्स कोडबेस का हिस्सा, KVM का EL2 घटक कई EL1s के बीच स्विच का प्रभारी एक छोटा घटक है, और पूरी तरह से होस्ट के कर्नेल द्वारा नियंत्रित होता है। हाइपरवाइज़र घटक लिनक्स के साथ संकलित है, लेकिन vmlinux छवि के एक अलग, समर्पित मेमोरी अनुभाग में रहता है। पीकेवीएम हाइपरवाइजर कोड को नई सुविधाओं के साथ विस्तारित करके इस डिज़ाइन का लाभ उठाता है, जिससे यह एंड्रॉइड होस्ट कर्नेल और उपयोगकर्ता स्थान पर प्रतिबंध लगा सकता है, और अतिथि मेमोरी और हाइपरवाइजर तक होस्ट की पहुंच को सीमित कर सकता है।

pKVM विक्रेता मॉड्यूल

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

पीकेवीएम विक्रेता मॉड्यूल को कार्यान्वित और लोड करने का तरीका जानने के लिए, पीकेवीएम विक्रेता मॉड्यूल लागू करें देखें।

बूट प्रक्रिया

निम्नलिखित चित्र pKVM बूट प्रक्रिया को दर्शाता है:

pKVM बूट प्रक्रिया

चित्र 1. pKVM बूट प्रक्रिया

  1. बूटलोडर EL2 पर जेनेरिक कर्नेल में प्रवेश करता है।
  2. जेनेरिक कर्नेल पता लगाता है कि यह EL2 पर चल रहा है और खुद को EL1 से वंचित कर देता है जबकि pKVM और इसके मॉड्यूल EL2 पर चलते रहते हैं। इसके अतिरिक्त, इस समय pKVM विक्रेता मॉड्यूल लोड किए गए हैं।
  3. जेनेरिक कर्नेल सामान्य रूप से बूट होने लगता है, उपयोगकर्ता स्थान तक पहुंचने तक सभी आवश्यक डिवाइस ड्राइवरों को लोड करता है। इस बिंदु पर, pKVM अपनी जगह पर है और स्टेज-2 पेज टेबल को संभालता है।

बूट प्रक्रिया केवल प्रारंभिक बूट के दौरान कर्नेल छवि की अखंडता बनाए रखने के लिए बूटलोडर पर भरोसा करती है। जब कर्नेल वंचित हो जाता है, तो इसे हाइपरवाइजर द्वारा विश्वसनीय नहीं माना जाता है, जो तब कर्नेल से समझौता होने पर भी खुद को बचाने के लिए जिम्मेदार होता है।

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

इसके अलावा, एंड्रॉइड इकोसिस्टम में जीकेआई को अपनाने से पीकेवीएम हाइपरवाइजर को कर्नेल के समान बाइनरी में एंड्रॉइड डिवाइस पर तैनात करने की अनुमति मिलती है।

सीपीयू मेमोरी एक्सेस सुरक्षा

आर्म आर्किटेक्चर एक मेमोरी प्रबंधन इकाई (एमएमयू) को दो स्वतंत्र चरणों में विभाजित करता है, जिसका उपयोग मेमोरी के विभिन्न हिस्सों में एड्रेस ट्रांसलेशन और एक्सेस कंट्रोल को लागू करने के लिए किया जा सकता है। चरण 1 एमएमयू को ईएल1 द्वारा नियंत्रित किया जाता है और यह पहले स्तर के पते के अनुवाद की अनुमति देता है। स्टेज 1 एमएमयू का उपयोग लिनक्स द्वारा प्रत्येक यूजरस्पेस प्रक्रिया और अपने स्वयं के वर्चुअल एड्रेस स्पेस को प्रदान किए गए वर्चुअल एड्रेस स्पेस को प्रबंधित करने के लिए किया जाता है।

स्टेज 2 एमएमयू को ईएल2 द्वारा नियंत्रित किया जाता है और स्टेज 1 एमएमयू के आउटपुट पते पर दूसरे एड्रेस ट्रांसलेशन के अनुप्रयोग को सक्षम बनाता है, जिसके परिणामस्वरूप एक भौतिक पता (पीए) प्राप्त होता है। चरण 2 अनुवाद का उपयोग हाइपरवाइज़र द्वारा सभी अतिथि वीएम से मेमोरी एक्सेस को नियंत्रित और अनुवाद करने के लिए किया जा सकता है। जैसा कि चित्र 2 में दिखाया गया है, जब अनुवाद के दोनों चरण सक्षम होते हैं, तो चरण 1 के आउटपुट पते को मध्यवर्ती भौतिक पता (आईपीए) कहा जाता है नोट: वर्चुअल पता (वीए) को आईपीए और फिर पीए में अनुवादित किया जाता है।

सीपीयू मेमोरी एक्सेस सुरक्षा

चित्र 2. सीपीयू मेमोरी एक्सेस सुरक्षा

ऐतिहासिक रूप से, केवीएम मेहमानों को चलाते समय चरण 2 अनुवाद सक्षम के साथ चलता है और होस्ट लिनक्स कर्नेल चलाते समय चरण 2 अक्षम होता है। यह आर्किटेक्चर होस्ट स्टेज 1 एमएमयू से मेमोरी एक्सेस को स्टेज 2 एमएमयू से गुजरने की अनुमति देता है, इसलिए होस्ट से गेस्ट मेमोरी पेजों तक अप्रतिबंधित पहुंच की अनुमति देता है। दूसरी ओर, पीकेवीएम होस्ट संदर्भ में भी चरण 2 सुरक्षा को सक्षम बनाता है, और होस्ट के बजाय अतिथि मेमोरी पेजों की सुरक्षा के लिए हाइपरवाइजर को प्रभारी बनाता है।

केवीएम मेहमानों के लिए जटिल आईपीए/पीए मैपिंग को लागू करने के लिए चरण 2 पर पता अनुवाद का पूर्ण उपयोग करता है, जो भौतिक विखंडन के बावजूद मेहमानों के लिए सन्निहित स्मृति का भ्रम पैदा करता है। हालाँकि, होस्ट के लिए चरण 2 एमएमयू का उपयोग केवल अभिगम नियंत्रण तक ही सीमित है। होस्ट चरण 2 को पहचान-मैप किया गया है, यह सुनिश्चित करते हुए कि होस्ट आईपीए स्पेस में सन्निहित मेमोरी पीए स्पेस में सन्निहित है। यह आर्किटेक्चर पेज टेबल में बड़े मैपिंग के उपयोग की अनुमति देता है और परिणामस्वरूप ट्रांसलेशन लुकसाइड बफर (टीएलबी) पर दबाव कम करता है। क्योंकि एक पहचान मानचित्रण को पीए द्वारा अनुक्रमित किया जा सकता है, होस्ट चरण 2 का उपयोग सीधे पृष्ठ तालिका में पृष्ठ स्वामित्व को ट्रैक करने के लिए भी किया जाता है।

डायरेक्ट मेमोरी एक्सेस (डीएमए) सुरक्षा

जैसा कि पहले बताया गया है, सीपीयू पेज टेबल में लिनक्स होस्ट से अतिथि पृष्ठों को अनमैप करना अतिथि मेमोरी की सुरक्षा के लिए एक आवश्यक लेकिन अपर्याप्त कदम है। पीकेवीएम को होस्ट कर्नेल के नियंत्रण के तहत डीएमए-सक्षम उपकरणों द्वारा की गई मेमोरी एक्सेस और दुर्भावनापूर्ण होस्ट द्वारा शुरू किए गए डीएमए हमले की संभावना से भी बचाने की आवश्यकता है। ऐसे डिवाइस को अतिथि मेमोरी तक पहुंचने से रोकने के लिए, पीकेवीएम को सिस्टम में प्रत्येक डीएमए-सक्षम डिवाइस के लिए इनपुट-आउटपुट मेमोरी मैनेजमेंट यूनिट (आईओएमएमयू) हार्डवेयर की आवश्यकता होती है, जैसा कि चित्र 3 में दिखाया गया है।

डीएमए मेमोरी एक्सेस सुरक्षा

चित्र 3. डीएमए मेमोरी एक्सेस सुरक्षा

कम से कम, IOMMU हार्डवेयर किसी डिवाइस के लिए पेज ग्रैन्युलैरिटी पर भौतिक मेमोरी तक पढ़ने/लिखने की पहुंच प्रदान करने और रद्द करने का साधन प्रदान करता है। हालाँकि, यह IOMMU हार्डवेयर pVMs में उपकरणों के उपयोग को सीमित करता है क्योंकि वे एक पहचान-मैप चरण 2 मानते हैं।

वर्चुअल मशीनों के बीच अलगाव सुनिश्चित करने के लिए, विभिन्न संस्थाओं की ओर से उत्पन्न मेमोरी लेनदेन को IOMMU द्वारा अलग किया जाना चाहिए ताकि अनुवाद के लिए पेज टेबल के उचित सेट का उपयोग किया जा सके।

इसके अलावा, EL2 पर SoC-विशिष्ट कोड की मात्रा को कम करना pKVM के समग्र विश्वसनीय कंप्यूटिंग बेस (TCB) को कम करने की एक महत्वपूर्ण रणनीति है और हाइपरवाइजर में IOMMU ड्राइवरों को शामिल करने के विपरीत है। इस समस्या को कम करने के लिए, EL1 पर होस्ट सहायक IOMMU प्रबंधन कार्यों, जैसे पावर प्रबंधन, आरंभीकरण और, जहां उपयुक्त हो, इंटरप्ट हैंडलिंग के लिए जिम्मेदार है।

हालाँकि, होस्ट को डिवाइस स्थिति के नियंत्रण में रखने से IOMMU हार्डवेयर के प्रोग्रामिंग इंटरफ़ेस पर अतिरिक्त आवश्यकताएं हो जाती हैं ताकि यह सुनिश्चित किया जा सके कि अनुमति जांच को अन्य तरीकों से बायपास नहीं किया जा सकता है, उदाहरण के लिए, डिवाइस रीसेट के बाद।

आर्म उपकरणों के लिए एक मानक और अच्छी तरह से समर्थित IOMMU जो अलगाव और प्रत्यक्ष असाइनमेंट दोनों को संभव बनाता है, आर्म सिस्टम मेमोरी मैनेजमेंट यूनिट (SMMU) आर्किटेक्चर है। यह आर्किटेक्चर अनुशंसित संदर्भ समाधान है.

स्मृति स्वामित्व

बूट समय पर, सभी गैर-हाइपरवाइजर मेमोरी को होस्ट के स्वामित्व में माना जाता है, और हाइपरवाइजर द्वारा इसे ट्रैक किया जाता है। जब एक पीवीएम उत्पन्न होता है, तो होस्ट इसे बूट करने की अनुमति देने के लिए मेमोरी पेज दान करता है और हाइपरवाइजर उन पेजों के स्वामित्व को होस्ट से पीवीएम में स्थानांतरित कर देता है। इस प्रकार, हाइपरविजर मेजबान के चरण 2 पृष्ठ तालिका में पहुंच-नियंत्रण प्रतिबंध लगाता है ताकि उसे पृष्ठों तक दोबारा पहुंचने से रोका जा सके, जिससे अतिथि को गोपनीयता प्रदान की जा सके।

मेज़बान और मेहमानों के बीच संचार उनके बीच नियंत्रित स्मृति साझाकरण द्वारा संभव होता है। मेहमानों को हाइपरकॉल का उपयोग करके अपने कुछ पेज होस्ट के साथ वापस साझा करने की अनुमति है, जो हाइपरवाइज़र को उन पेजों को होस्ट चरण 2 पेज तालिका में रीमैप करने का निर्देश देता है। इसी तरह, ट्रस्टज़ोन के साथ होस्ट का संचार मेमोरी शेयरिंग और/या उधार संचालन द्वारा संभव बनाया गया है, जिनमें से सभी को फर्मवेयर फ्रेमवर्क फॉर आर्म (एफएफ-ए) विनिर्देश का उपयोग करके पीकेवीएम द्वारा बारीकी से निगरानी और नियंत्रित किया जाता है।

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

हाइपरवाइज़र सिस्टम में सभी मेमोरी पेजों के स्वामित्व पर नज़र रखने के लिए ज़िम्मेदार है और क्या उन्हें अन्य संस्थाओं को साझा किया जा रहा है या उधार दिया जा रहा है। इस स्थिति की अधिकांश ट्रैकिंग होस्ट और मेहमानों के चरण 2 पेज टेबल से जुड़े मेटाडेटा का उपयोग करके की जाती है, पेज टेबल प्रविष्टियों (पीटीई) में आरक्षित बिट्स का उपयोग करके, जैसा कि उनके नाम से पता चलता है, सॉफ्टवेयर उपयोग के लिए आरक्षित हैं।

होस्ट को यह सुनिश्चित करना होगा कि वह उन पेजों तक पहुंचने का प्रयास न करे जिन्हें हाइपरवाइज़र द्वारा पहुंच से बाहर कर दिया गया है। एक अवैध होस्ट एक्सेस के कारण हाइपरवाइजर द्वारा होस्ट में एक सिंक्रोनस अपवाद इंजेक्ट किया जाता है, जिसके परिणामस्वरूप या तो जिम्मेदार यूजरस्पेस कार्य को SEGV सिग्नल प्राप्त हो सकता है, या होस्ट कर्नेल क्रैश हो सकता है। आकस्मिक पहुंच को रोकने के लिए, मेहमानों को दान किए गए पेज होस्ट कर्नेल द्वारा स्वैपिंग या विलय के लिए अयोग्य बना दिए जाते हैं।

हैंडलिंग और टाइमर को बाधित करें

जिस तरह से अतिथि उपकरणों के साथ इंटरैक्ट करता है और सीपीयू के बीच संचार के लिए इंटरप्ट एक अनिवार्य हिस्सा है, जहां इंटरप्रोसेसर इंटरप्ट (आईपीआई) मुख्य संचार तंत्र हैं। KVM मॉडल सभी वर्चुअल इंटरप्ट प्रबंधन को EL1 में होस्ट को सौंपना है, जो उस उद्देश्य के लिए हाइपरवाइजर के एक अविश्वसनीय हिस्से के रूप में व्यवहार करता है।

pKVM मौजूदा KVM कोड के आधार पर एक पूर्ण जेनेरिक इंटरप्ट कंट्रोलर संस्करण 3 (GICv3) अनुकरण प्रदान करता है। टाइमर और आईपीआई को इस अविश्वसनीय इम्यूलेशन कोड के हिस्से के रूप में नियंत्रित किया जाता है।

GICv3 समर्थन

EL1 और EL2 के बीच इंटरफ़ेस को यह सुनिश्चित करना चाहिए कि पूर्ण इंटरप्ट स्थिति EL1 होस्ट को दिखाई दे, जिसमें इंटरप्ट से संबंधित हाइपरवाइजर रजिस्टरों की प्रतियां भी शामिल हैं। यह दृश्यता आम तौर पर साझा मेमोरी क्षेत्रों, प्रति वर्चुअल सीपीयू (वीसीपीयू) का उपयोग करके पूरी की जाती है।

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

एमएमआईओ की ओर से, केवीएम में सभी मौजूदा बुनियादी ढांचे का पुन: उपयोग करते हुए, ईएल1 पर सब कुछ अनुकरण किया जाता है। अंत में, वेट फॉर इंटरप्ट (WFI) को हमेशा EL1 पर रिले किया जाता है, क्योंकि यह KVM द्वारा उपयोग किए जाने वाले बुनियादी शेड्यूलिंग प्रिमिटिव में से एक है।

टाइमर समर्थन

वर्चुअल टाइमर के लिए तुलनित्र मान को प्रत्येक ट्रैपिंग WFI पर EL1 के संपर्क में लाया जाना चाहिए ताकि vCPU अवरुद्ध होने पर EL1 टाइमर व्यवधान को इंजेक्ट कर सके। भौतिक टाइमर पूरी तरह से अनुकरणीय है, और सभी ट्रैप EL1 पर रिले किए गए हैं।

एमएमआईओ हैंडलिंग

वर्चुअल मशीन मॉनिटर (वीएमएम) के साथ संचार करने और जीआईसी अनुकरण करने के लिए, एमएमआईओ ट्रैप को आगे की ट्राइएजिंग के लिए ईएल1 में होस्ट पर वापस रिले किया जाना चाहिए। pKVM को निम्नलिखित की आवश्यकता है:

  • आईपीए और पहुंच का आकार
  • लिखने के मामले में डेटा
  • फँसने के बिंदु पर सीपीयू की अंतहीनता

इसके अतिरिक्त, स्रोत/गंतव्य के रूप में सामान्य प्रयोजन रजिस्टर (जीपीआर) वाले जाल को एक अमूर्त स्थानांतरण छद्म-रजिस्टर का उपयोग करके रिले किया जाता है।

अतिथि इंटरफ़ेस

एक अतिथि हाइपरकॉल और फंसे हुए क्षेत्रों में मेमोरी एक्सेस के संयोजन का उपयोग करके संरक्षित अतिथि के साथ संचार कर सकता है। हाइपरकॉल को एसएमसीसीसी मानक के अनुसार उजागर किया जाता है, जिसमें केवीएम द्वारा विक्रेता आवंटन के लिए एक सीमा आरक्षित होती है। निम्नलिखित हाइपरकॉल pKVM मेहमानों के लिए विशेष महत्व के हैं।

सामान्य हाइपरकॉल

  • पीएससीआई अतिथि को ऑनलाइन, ऑफलाइन और सिस्टम शटडाउन सहित अपने वीसीपीयू के जीवनचक्र को नियंत्रित करने के लिए एक मानक तंत्र प्रदान करता है।
  • TRNG अतिथि को pKVM से एन्ट्रापी का अनुरोध करने के लिए एक मानक तंत्र प्रदान करता है जो कॉल को EL3 पर रिले करता है। यह तंत्र विशेष रूप से उपयोगी है जहां होस्ट को हार्डवेयर यादृच्छिक संख्या जनरेटर (आरएनजी) को वर्चुअलाइज करने के लिए भरोसा नहीं किया जा सकता है।

pKVM हाइपरकॉल

  • मेज़बान के साथ स्मृति साझा करना। सभी अतिथि मेमोरी प्रारंभ में होस्ट के लिए पहुंच योग्य नहीं है, लेकिन साझा-मेमोरी संचार और साझा बफ़र्स पर भरोसा करने वाले पैरावर्चुअलाइज्ड डिवाइसों के लिए होस्ट एक्सेस आवश्यक है। होस्ट के साथ पृष्ठों को साझा करने और अनशेयर करने के लिए हाइपरकॉल्स अतिथि को यह तय करने की अनुमति देते हैं कि मेमोरी के किन हिस्सों को हैंडशेक की आवश्यकता के बिना एंड्रॉइड के बाकी हिस्सों तक पहुंच योग्य बनाया जाए।
  • यजमान को स्मृति का त्याग। सभी अतिथि स्मृति आमतौर पर तब तक अतिथि की होती है जब तक वह नष्ट न हो जाए। यह स्थिति लंबे समय तक चलने वाले वीएम के लिए अपर्याप्त हो सकती है, जिनकी मेमोरी आवश्यकताएं समय के साथ बदलती रहती हैं। relinquish हाइपरकॉल अतिथि को अतिथि समाप्ति की आवश्यकता के बिना पृष्ठों के स्वामित्व को स्पष्ट रूप से होस्ट को स्थानांतरित करने की अनुमति देता है।
  • होस्ट तक मेमोरी एक्सेस ट्रैपिंग। परंपरागत रूप से, यदि कोई केवीएम अतिथि किसी ऐसे पते तक पहुंचता है जो वैध मेमोरी क्षेत्र से मेल नहीं खाता है, तो वीसीपीयू थ्रेड होस्ट से बाहर निकल जाता है और एक्सेस आमतौर पर एमएमआईओ के लिए उपयोग किया जाता है और उपयोगकर्ता स्थान में वीएमएम द्वारा अनुकरण किया जाता है। इस प्रबंधन को सुविधाजनक बनाने के लिए, पीकेवीएम को दोषपूर्ण निर्देश के बारे में विवरण जैसे कि उसका पता, रजिस्टर पैरामीटर और संभावित रूप से उनकी सामग्री को होस्ट पर वापस विज्ञापित करने की आवश्यकता होती है, जो जाल की आशंका नहीं होने पर अनजाने में संरक्षित अतिथि से संवेदनशील डेटा को उजागर कर सकता है। पीकेवीएम इन दोषों को घातक मानकर इस समस्या का समाधान करता है, जब तक कि अतिथि ने पहले दोषपूर्ण आईपीए रेंज की पहचान करने के लिए हाइपरकॉल जारी नहीं किया हो, जिसके लिए एक्सेस को होस्ट पर वापस ट्रैप करने की अनुमति दी जाती है। इस समाधान को MMIO गार्ड कहा जाता है।

वर्चुअल I/O डिवाइस (virtio)

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

Virtio उपकरणों को आम तौर पर VMM द्वारा होस्ट के उपयोगकर्ता स्थान में कार्यान्वित किया जाता है, जो अतिथि से Virtio डिवाइस के MMIO इंटरफ़ेस तक फंसी हुई मेमोरी एक्सेस को रोकता है और अपेक्षित व्यवहार का अनुकरण करता है। एमएमआईओ एक्सेस अपेक्षाकृत महंगा है क्योंकि डिवाइस तक प्रत्येक एक्सेस के लिए वीएमएम और वापस जाने के लिए एक राउंड-ट्रिप की आवश्यकता होती है, इसलिए डिवाइस और गेस्ट के बीच अधिकांश वास्तविक डेटा ट्रांसफर मेमोरी में वर्टीक्यू के सेट का उपयोग करके होता है। Virtio की एक प्रमुख धारणा यह है कि होस्ट मनमाने ढंग से अतिथि मेमोरी तक पहुंच सकता है। यह धारणा वर्टक्यू के डिज़ाइन में स्पष्ट है, जिसमें अतिथि में बफ़र्स के लिए पॉइंटर्स शामिल हो सकते हैं जिन्हें डिवाइस इम्यूलेशन सीधे एक्सेस करने का इरादा रखता है।

हालाँकि पहले वर्णित मेमोरी शेयरिंग हाइपरकॉल का उपयोग अतिथि से होस्ट तक गुणी डेटा बफ़र्स को साझा करने के लिए किया जा सकता है, यह साझाकरण आवश्यक रूप से पृष्ठ ग्रैन्युलैरिटी पर किया जाता है और यदि बफ़र का आकार पृष्ठ से कम है तो आवश्यकता से अधिक डेटा को उजागर कर सकता है। . इसके बजाय, अतिथि को साझा मेमोरी की एक निश्चित विंडो से दोनों गुणों और उनके संबंधित डेटा बफ़र्स को आवंटित करने के लिए कॉन्फ़िगर किया गया है, आवश्यकतानुसार डेटा को विंडो से कॉपी (बाउंस) किया जाता है।

आभासी उपकरण

चित्र 4. वर्टियो डिवाइस

ट्रस्टज़ोन के साथ सहभागिता

हालाँकि मेहमान ट्रस्टज़ोन के साथ सीधे बातचीत करने में सक्षम नहीं हैं, फिर भी मेज़बान को सुरक्षित दुनिया में एसएमसी कॉल जारी करने में सक्षम होना चाहिए। ये कॉल भौतिक रूप से संबोधित मेमोरी बफ़र्स को निर्दिष्ट कर सकते हैं जो होस्ट के लिए पहुंच योग्य नहीं हैं। क्योंकि सुरक्षित सॉफ़्टवेयर आम तौर पर बफ़र की पहुंच से अनजान होता है, एक दुर्भावनापूर्ण होस्ट इस बफ़र का उपयोग भ्रमित डिप्टी हमला (डीएमए हमले के अनुरूप) करने के लिए कर सकता है। ऐसे हमलों को रोकने के लिए, पीकेवीएम सभी होस्ट एसएमसी कॉलों को ईएल2 पर ट्रैप करता है और ईएल3 पर होस्ट और सुरक्षित मॉनिटर के बीच प्रॉक्सी के रूप में कार्य करता है।

होस्ट से PSCI कॉल न्यूनतम संशोधनों के साथ EL3 फर्मवेयर पर अग्रेषित की जाती हैं। विशेष रूप से, सीपीयू के ऑनलाइन आने या सस्पेंड से फिर से शुरू होने के लिए प्रवेश बिंदु को फिर से लिखा जाता है ताकि ईएल1 पर होस्ट पर लौटने से पहले स्टेज 2 पेज टेबल ईएल2 पर स्थापित हो जाए। बूट के दौरान, यह सुरक्षा pKVM द्वारा लागू की जाती है।

यह आर्किटेक्चर PSCI को सपोर्ट करने वाले SoC पर निर्भर करता है, अधिमानतः इसके EL3 फर्मवेयर के रूप में TF-A के अप-टू-डेट संस्करण के उपयोग के माध्यम से।

आर्म के लिए फर्मवेयर फ्रेमवर्क (एफएफ-ए) सामान्य और सुरक्षित दुनिया के बीच बातचीत को मानकीकृत करता है, खासकर एक सुरक्षित हाइपरवाइजर की उपस्थिति में। विनिर्देश का एक प्रमुख हिस्सा एक सामान्य संदेश प्रारूप और अंतर्निहित पृष्ठों के लिए एक अच्छी तरह से परिभाषित अनुमति मॉडल दोनों का उपयोग करके सुरक्षित दुनिया के साथ मेमोरी साझा करने के लिए एक तंत्र को परिभाषित करता है। pKVM यह सुनिश्चित करने के लिए FF-A संदेशों को प्रॉक्सी करता है कि होस्ट सुरक्षित पक्ष के साथ मेमोरी साझा करने का प्रयास नहीं कर रहा है जिसके लिए उसके पास पर्याप्त अनुमतियाँ नहीं हैं।

यह आर्किटेक्चर मेमोरी एक्सेस मॉडल को लागू करने वाले सुरक्षित विश्व सॉफ़्टवेयर पर निर्भर करता है, ताकि यह सुनिश्चित किया जा सके कि विश्वसनीय ऐप्स और सुरक्षित दुनिया में चल रहे कोई भी अन्य सॉफ़्टवेयर केवल मेमोरी तक पहुंच सकते हैं यदि यह या तो विशेष रूप से सुरक्षित दुनिया के स्वामित्व में है या एफएफ का उपयोग करके स्पष्ट रूप से इसके साथ साझा किया गया है। -एक। एस-ईएल2 वाले सिस्टम पर, मेमोरी एक्सेस मॉडल को लागू करना एक सुरक्षित विभाजन प्रबंधक कोर (एसपीएमसी) द्वारा किया जाना चाहिए, जैसे कि हेफ़नियम , जो सुरक्षित दुनिया के लिए चरण 2 पेज टेबल बनाए रखता है। एस-ईएल2 के बिना सिस्टम पर, टीईई इसके चरण 1 पृष्ठ तालिकाओं के माध्यम से मेमोरी एक्सेस मॉडल लागू कर सकता है।

यदि ईएल2 को एसएमसी कॉल पीएससीआई कॉल या एफएफ-ए परिभाषित संदेश नहीं है, तो बिना संभाले एसएमसी को ईएल3 पर अग्रेषित कर दिया जाता है। धारणा यह है कि (आवश्यक रूप से विश्वसनीय) सुरक्षित फर्मवेयर अनहैंडल किए गए एसएमसी को सुरक्षित रूप से संभाल सकता है क्योंकि फर्मवेयर पीवीएम अलगाव को बनाए रखने के लिए आवश्यक सावधानियों को समझता है।

वर्चुअल मशीन मॉनिटर

crosvm एक वर्चुअल मशीन मॉनिटर (VMM) है जो Linux के KVM इंटरफ़ेस के माध्यम से वर्चुअल मशीन चलाता है। जो चीज़ crosvm को अद्वितीय बनाती है, वह रस्ट प्रोग्रामिंग भाषा के उपयोग और होस्ट कर्नेल की सुरक्षा के लिए आभासी उपकरणों के आसपास एक सैंडबॉक्स के साथ सुरक्षा पर ध्यान केंद्रित करना है। क्रॉसवीएम के बारे में अधिक जानकारी के लिए इसका आधिकारिक दस्तावेज यहां देखें।

फ़ाइल डिस्क्रिप्टर और ioctls

KVM /dev/kvm कैरेक्टर डिवाइस को ioctls के साथ यूजरस्पेस में उजागर करता है जो KVM API बनाते हैं। ioctls निम्नलिखित श्रेणियों से संबंधित हैं:

  • सिस्टम ioctls क्वेरी करता है और वैश्विक विशेषताएँ सेट करता है जो संपूर्ण KVM सबसिस्टम को प्रभावित करती हैं, और pVM बनाती हैं।
  • VM ioctls क्वेरी और विशेषताएँ सेट करता है जो वर्चुअल CPU (vCPU) और डिवाइस बनाता है, और संपूर्ण pVM को प्रभावित करता है, जैसे मेमोरी लेआउट और वर्चुअल CPU (vCPU) और डिवाइस की संख्या शामिल है।
  • vCPU ioctls क्वेरी और सेट विशेषताएँ जो एकल वर्चुअल CPU के संचालन को नियंत्रित करती हैं।
  • डिवाइस ioctls क्वेरी और सेट विशेषताएँ जो एकल वर्चुअल डिवाइस के संचालन को नियंत्रित करती हैं।

प्रत्येक crosvm प्रक्रिया वर्चुअल मशीन का ठीक एक उदाहरण चलाती है। यह प्रक्रिया एक VM फ़ाइल डिस्क्रिप्टर बनाने के लिए KVM_CREATE_VM सिस्टम ioctl का उपयोग करती है जिसका उपयोग pVM ioctls जारी करने के लिए किया जा सकता है। VM FD पर KVM_CREATE_VCPU या KVM_CREATE_DEVICE ioctl एक vCPU/डिवाइस बनाता है और नए संसाधन की ओर इशारा करते हुए एक फ़ाइल डिस्क्रिप्टर लौटाता है। वीसीपीयू या डिवाइस एफडी पर ioctl का उपयोग उस डिवाइस को नियंत्रित करने के लिए किया जा सकता है जो VM FD पर ioctl का उपयोग करके बनाया गया था। वीसीपीयू के लिए, इसमें अतिथि कोड चलाने का महत्वपूर्ण कार्य शामिल है।

आंतरिक रूप से, crosvm एज-ट्रिगर epoll इंटरफ़ेस का उपयोग करके कर्नेल के साथ VM के फ़ाइल डिस्क्रिप्टर को पंजीकृत करता है। जब भी किसी फ़ाइल डिस्क्रिप्टर में कोई नया ईवेंट लंबित होता है, तो कर्नेल crosvm को सूचित करता है।

pKVM एक नई क्षमता, KVM_CAP_ARM_PROTECTED_VM जोड़ता है, जिसका उपयोग pVM पर्यावरण के बारे में जानकारी प्राप्त करने और VM के लिए संरक्षित मोड सेट करने के लिए किया जा सकता है। क्रॉसवीएम इसका उपयोग पीवीएम निर्माण के दौरान करता है यदि --protected-vm ध्वज पारित किया जाता है, पीवीएम फर्मवेयर के लिए उचित मात्रा में मेमोरी को क्वेरी करने और आरक्षित करने के लिए, और फिर संरक्षित मोड को सक्षम करने के लिए।

स्मृति आवंटन

वीएमएम की मुख्य जिम्मेदारियों में से एक वीएम की मेमोरी आवंटित करना और उसके मेमोरी लेआउट का प्रबंधन करना है। crosvm एक निश्चित मेमोरी लेआउट उत्पन्न करता है जिसका वर्णन नीचे दी गई तालिका में स्पष्ट रूप से किया गया है।

सामान्य मोड में एफडीटी PHYS_MEMORY_END - 0x200000
मुक्त स्थान ...
रैमडिस्क ALIGN_UP(KERNEL_END, 0x1000000)
गुठली 0x80080000
बूटलोडर 0x80200000
BIOS मोड में FDT 0x80000000
भौतिक स्मृति आधार 0x80000000
पीवीएम फर्मवेयर 0x7FE00000
उपकरण की स्मृति 0x10000 - 0x40000000

भौतिक मेमोरी को mmap के साथ आवंटित किया जाता है और मेमोरी को KVM_SET_USER_MEMORY_REGION ioctl के साथ इसके मेमोरी क्षेत्रों, जिन्हें memslots कहा जाता है, को पॉप्युलेट करने के लिए VM को दान किया जाता है। इसलिए सभी अतिथि पीवीएम मेमोरी को क्रॉसवीएम इंस्टेंस के लिए जिम्मेदार ठहराया जाता है जो इसे प्रबंधित करता है और यदि होस्ट की मुफ्त मेमोरी खत्म होने लगती है तो इसके परिणामस्वरूप प्रक्रिया समाप्त हो सकती है (वीएम को समाप्त करना)। जब एक वीएम बंद हो जाता है, तो मेमोरी स्वचालित रूप से हाइपरवाइजर द्वारा मिटा दी जाती है और होस्ट कर्नेल में वापस आ जाती है।

नियमित केवीएम के तहत, वीएमएम सभी अतिथि मेमोरी तक पहुंच बनाए रखता है। पीकेवीएम के साथ, अतिथि मेमोरी को अतिथि को दान किए जाने पर होस्ट भौतिक पता स्थान से अनमैप किया जाता है। एकमात्र अपवाद अतिथि द्वारा स्पष्ट रूप से साझा की गई मेमोरी है, जैसे कि गुणी उपकरणों के लिए।

अतिथि के पता स्थान में एमएमआईओ क्षेत्रों को मैप नहीं किया गया है। अतिथि द्वारा इन क्षेत्रों तक पहुंच फँस जाती है और परिणामस्वरूप VM FD पर I/O इवेंट होता है। इस तंत्र का उपयोग आभासी उपकरणों को लागू करने के लिए किया जाता है। संरक्षित मोड में, अतिथि को यह स्वीकार करना होगा कि आकस्मिक सूचना रिसाव के जोखिम को कम करने के लिए, हाइपरकॉल का उपयोग करके उसके पता स्थान का एक क्षेत्र एमएमआईओ के लिए उपयोग किया जाता है।

निर्धारण

प्रत्येक वर्चुअल सीपीयू को POSIX थ्रेड द्वारा दर्शाया जाता है और होस्ट लिनक्स शेड्यूलर द्वारा शेड्यूल किया जाता है। थ्रेड vCPU FD पर KVM_RUN ioctl को कॉल करता है, जिसके परिणामस्वरूप हाइपरविजर अतिथि vCPU संदर्भ पर स्विच हो जाता है। होस्ट शेड्यूलर अतिथि संदर्भ में बिताए गए समय को संबंधित वीसीपीयू थ्रेड द्वारा उपयोग किए गए समय के रूप में खाता है। KVM_RUN तब लौटता है जब कोई ऐसी घटना होती है जिसे VMM द्वारा नियंत्रित किया जाना चाहिए, जैसे I/O, रुकावट का अंत, या vCPU रुका हुआ। VMM ईवेंट को संभालता है और KVM_RUN फिर से कॉल करता है।

KVM_RUN के दौरान, थ्रेड होस्ट शेड्यूलर द्वारा प्रीमेप्टेबल रहता है, EL2 हाइपरवाइजर कोड के निष्पादन को छोड़कर, जो प्रीमेप्टेबल नहीं है। अतिथि पीवीएम के पास इस व्यवहार को नियंत्रित करने के लिए कोई तंत्र नहीं है।

क्योंकि सभी वीसीपीयू थ्रेड किसी भी अन्य यूजरस्पेस कार्यों की तरह शेड्यूल किए गए हैं, वे सभी मानक क्यूओएस तंत्र के अधीन हैं। विशेष रूप से, प्रत्येक वीसीपीयू थ्रेड को भौतिक सीपीयू से जोड़ा जा सकता है, सीपीयूसेट में रखा जा सकता है, उपयोग क्लैम्पिंग का उपयोग करके बूस्ट या कैप किया जा सकता है, उनकी प्राथमिकता/शेड्यूलिंग नीति बदली जा सकती है, और भी बहुत कुछ।

आभासी उपकरण

crosvm निम्नलिखित सहित कई उपकरणों का समर्थन करता है:

  • समग्र डिस्क छवियों के लिए virtio-blk, केवल पढ़ने के लिए या पढ़ने के लिए लिखने के लिए
  • होस्ट के साथ संचार के लिए vhost-vsock
  • वर्टियो-पीसीआई वर्टियो ट्रांसपोर्ट के रूप में
  • PL030 वास्तविक समय घड़ी (आरटीसी)
  • धारावाहिक संचार के लिए 16550ए यूएआरटी

पीवीएम फर्मवेयर

pVM फ़र्मवेयर (pvmfw) किसी भौतिक डिवाइस के बूट ROM के समान, pVM द्वारा निष्पादित पहला कोड है। pvmfw का प्राथमिक लक्ष्य सुरक्षित बूट को बूटस्ट्रैप करना और pVM के अनूठे रहस्य को प्राप्त करना है। pvmfw किसी विशिष्ट OS, जैसे कि Microdroid , के साथ उपयोग तक सीमित नहीं है, जब तक कि OS crosvm द्वारा समर्थित है और उचित रूप से हस्ताक्षरित है।

Pvmfw बाइनरी को उसी नाम के फ़्लैश विभाजन में संग्रहीत किया जाता है और OTA का उपयोग करके अद्यतन किया जाता है।

डिवाइस बूट

चरणों का निम्नलिखित क्रम pKVM-सक्षम डिवाइस की बूट प्रक्रिया में जोड़ा जाता है:

  1. एंड्रॉइड बूटलोडर (एबीएल) अपने विभाजन से pvmfw को मेमोरी में लोड करता है और छवि को सत्यापित करता है।
  2. एबीएल अपने डिवाइस आइडेंटिफ़ायर कंपोज़िशन इंजन (DICE) रहस्य (कंपाउंड डिवाइस आइडेंटिफ़ायर (CDIs) और बूट सर्टिफिकेट चेन (BCC)) को ट्रस्ट के रूट से प्राप्त करता है।
  3. एबीएल पीवीएमएफडब्ल्यू के रहस्यों (सीडीआई) का माप और डीआईसीई व्युत्पत्ति करता है, और उन्हें पीवीएमएफडब्ल्यू बाइनरी में जोड़ता है।
  4. एबीएल डीटी में एक linux,pkvm-guest-firmware-memory आरक्षित मेमोरी क्षेत्र नोड जोड़ता है, जो पीवीएमएफडब्ल्यू बाइनरी के स्थान और आकार और पिछले चरण में प्राप्त रहस्यों का वर्णन करता है।
  5. एबीएल लिनक्स को नियंत्रण सौंपता है और लिनक्स पीकेवीएम को आरंभ करता है।
  6. pKVM होस्ट के स्टेज 2 पेज टेबल से pvmfw मेमोरी क्षेत्र को अनमैप करता है और डिवाइस अपटाइम के दौरान इसे होस्ट (और मेहमानों) से बचाता है।

डिवाइस बूट के बाद, माइक्रोड्रॉइड दस्तावेज़ के बूट अनुक्रम अनुभाग में चरणों के अनुसार माइक्रोड्रॉइड को बूट किया जाता है।

पीवीएम बूट

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

जब पीवीएम चलाया जाता है, तो हाइपरवाइजर पहले प्राथमिक वीसीपीयू का नियंत्रण पीवीएमएफडब्ल्यू को सौंप देता है। फ़र्मवेयर को उम्मीद है कि crosvm ने एक AVB-हस्ताक्षरित कर्नेल लोड किया है, जो एक बूटलोडर या कोई अन्य छवि हो सकता है, और ज्ञात ऑफसेट पर मेमोरी में एक अहस्ताक्षरित FDT हो सकता है। pvmfw AVB हस्ताक्षर को मान्य करता है और, सफल होने पर, प्राप्त FDT से एक विश्वसनीय डिवाइस ट्री बनाता है, मेमोरी से इसके रहस्यों को मिटा देता है, और शाखाओं को पेलोड के प्रवेश बिंदु पर भेज देता है। यदि सत्यापन चरणों में से एक विफल हो जाता है, तो फ़र्मवेयर PSCI SYSTEM_RESET हाइपरकॉल जारी करता है।

बूट के बीच, pVM इंस्टेंस के बारे में जानकारी एक पार्टीशन (virtio-blk डिवाइस) में संग्रहीत की जाती है और यह सुनिश्चित करने के लिए pvmfw के रहस्य के साथ एन्क्रिप्ट किया जाता है कि, रिबूट के बाद, रहस्य को सही उदाहरण के लिए प्रावधानित किया जा रहा है।