क्या x86 निर्देशों के लिए अपने स्वयं के एन्कोडिंग के साथ-साथ उनके सभी तर्कों को एक ही समय में मेमोरी में उपस्थित होने की आवश्यकता है?


64

मैं यह पता लगाने की कोशिश कर रहा हूं कि क्या लिनक्स वीएम चलाना संभव है, जिसकी रैम केवल एक भौतिक पृष्ठ द्वारा समर्थित है।

इसे अनुकरण करने के लिए, मैंने केवीएम में नेस्टेड पेज फॉल्ट हैंडलर को सभी नेस्टेड पेज टेबल (एनपीटी) प्रविष्टियों से वर्तमान बिट को हटाने के लिए संशोधित किया, वर्तमान में संसाधित पेज गलती के लिए एक को छोड़कर।

लिनक्स अतिथि शुरू करने का प्रयास करते समय, मैंने देखा कि विधानसभा निर्देश जो मेमोरी ऑपरेंड्स का उपयोग करते हैं, जैसे

add [rbp+0x820DDA], ebp

पेज फॉल्ट लूप का नेतृत्व तब तक करें जब तक कि मैं पेज को निर्देश के साथ-साथ ऑपरेंड (इस उदाहरण में [rbp+0x820DDA]) में संदर्भित पेज के लिए भी पुनर्स्थापित न कर दूं ।

मैं सोच रहा हूं कि ऐसा क्यों है। क्या CPU को मेमोरी पेजों को क्रमिक रूप से एक्सेस नहीं करना चाहिए, अर्थात पहले निर्देश पढ़ें और फिर मेमोरी ऑपरैंड को एक्सेस करें? या क्या x86 को निर्देश पृष्ठ के साथ-साथ सभी ऑपरेंड पृष्ठ एक ही समय में सुलभ हैं?

मैं AMD Zen 1 पर परीक्षण कर रहा हूं।


2
तुमने ऐसा क्यों करना चाहोगे?
एसएस ऐनी

11
तकनीकी हित से बाहर :)
savvybug

14
उल्लसित परियोजना विचार के लिए Upvoting।
पाइप

10
यह "ब्राउज़र में जावास्क्रिप्ट में चल रहे 486 एमुलेटर पर बूट लिनक्स" के स्तर पर पागल है। मुझे यह पसंद है।
क्राइसिस -ऑन स्ट्राइक-

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

जवाबों:


56

हां, उन्हें मशीन कोड और सभी मेमोरी ऑपरेंड की आवश्यकता होती है।

क्या CPU को मेमोरी पेजों को क्रमिक रूप से एक्सेस नहीं करना चाहिए, अर्थात पहले निर्देश पढ़ें और फिर मेमोरी ऑपरैंड को एक्सेस करें?

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

जब पेज-फॉल्ट हैंडलर एक वैध पेज फॉल्ट को हैंडल करने के बाद वापस आता है, तो RIP = फॉल्टिंग इंस्ट्रक्शन का पता होता है, इसलिए CPU इसे स्क्रैच से निष्पादित करता है

यह ओएस के लिए गलत निर्देश के मशीन कोड को संशोधित करने और iretपृष्ठ-गलती हैंडलर (या किसी अन्य अपवाद या बाधा हैंडलर) से एक अलग निर्देश को निष्पादित करने की अपेक्षा करेगा । तो AFAIK यह वास्तुशिल्प रूप से आवश्यक है कि सीपीयू सीएस से कोड-रिड्यूस करे: जिस मामले में आप बात कर रहे हैं, उसमें आरआईपी। (यह मानते हुए कि यह भी दोषपूर्ण सीएस पर वापस लौटता है: हार्ड पेज की गलती पर डिस्क की प्रतीक्षा करते समय, या एक अमान्य पृष्ठ गलती पर एक सिग्नल हैंडलर को SIGSEGV वितरित करते समय किसी अन्य प्रक्रिया को शेड्यूल करने के बजाय RIP।)

शायद यह भी कृत्रिम रूप से हाइपरविजर प्रवेश / निकास के लिए आवश्यक है। और भले ही यह कागज पर स्पष्ट रूप से निषिद्ध नहीं है, यह सीपीयू काम नहीं करता है।

@torek की टिप्पणी है कि कुछ (CISC) माइक्रोप्रोसेसर आंशिक रूप से निर्देशों को डिकोड करते हैं और एक पेज की गलती पर microregister स्थिति को डंप करते हैं , लेकिन x86 ऐसा नहीं है।


कुछ निर्देश बाधित होते हैं और आंशिक प्रगति कर सकते हैं, जैसे rep movs(कैन में मेम्ची) और अन्य स्ट्रिंग निर्देश, या लोड / स्कैटर स्टोर इकट्ठा कर सकते हैं। लेकिन एकमात्र तंत्र स्ट्रिंग ऑप्स के लिए RCX / RSI / RDI जैसे आर्किटेक्चरल रजिस्टर को अपडेट कर रहा है, या इकट्ठा करने के लिए गंतव्य और मास्क रजिस्टर (जैसे AVX2 केvpgatherdd लिए मैनुअल )। कुछ छिपे हुए आंतरिक रजिस्टर में ओपकोड / डीकोड परिणाम नहीं रखने और पेज गलती हैंडलर से iret के बाद इसे फिर से शुरू करना। ये निर्देश हैं जो कई अलग-अलग डेटा एक्सेस करते हैं।

यह भी ध्यान रखें कि x86 (अधिकांश ISAs की तरह) गारंटी देता है कि निर्देश परमाणु wrt हैं। व्यवधान / अपवाद: वे या तो पूरी तरह से होते हैं, या एक बाधा से पहले बिल्कुल नहीं होते हैं। संचालन करते समय एक विधानसभा निर्देश को बाधित करना । उदाहरण के लिए add [mem], regयदि स्टोर का हिस्सा खराब हो गया हो, तो भी lockउपसर्ग के बिना, लोड को छोड़ना आवश्यक होगा ।


आगे बढ़ने के लिए मौजूद अतिथि उपयोगकर्ता-स्पेस पेजों की सबसे खराब स्थिति 6 हो सकती है (प्रत्येक के लिए अलग-अलग गेस्ट-कर्नेल पेज-टेबल उपप्रकार):

  • movsqया movsw2-बाइट अनुदेश एक पृष्ठ सीमा को फैलाता है, इसलिए इसे डिकोड करने के लिए दोनों पृष्ठों की आवश्यकता होती है।
  • qword स्रोत ऑपरैंड [rsi]एक पृष्ठ-विभाजन भी करता है
  • qword गंतव्य ऑपरेंड [rdi]भी एक पृष्ठ-विभाजन है

यदि इन 6 पृष्ठों में से कोई भी दोष है, तो हम वापस एक वर्ग में आते हैं।

rep movsdएक 2-बाइट अनुदेश भी है, और इसके एक कदम पर प्रगति करने की समान आवश्यकता होगी। इसी तरह के मामलों की तरह है push [mem]या pop [mem]अनमेल ढेर के साथ निर्माण किया जा सकता है।

इकट्ठा लोड / स्कैटर स्टोर "इंटरटेबल" (उनकी प्रगति के साथ मुखौटा वेक्टर को अपडेट करना) बनाने के लिए कारणों (या साइड बेनिफिट्स) में से एक निर्देश को निष्पादित करने के लिए इस न्यूनतम पदचिह्न को बढ़ाने से बचना है। इसके अलावा एक इकट्ठा या बिखराव के दौरान कई दोषों से निपटने की दक्षता में सुधार करने के लिए।


@ ब्रैंड टिप्पणी में बताते हैं कि एक अतिथि को स्मृति में अपने पेज टेबल की आवश्यकता होगी , और उपयोगकर्ता-स्पेस पेज विभाजन 1GiB विभाजन भी हो सकते हैं, इसलिए दोनों पक्ष शीर्ष स्तर PML4 के विभिन्न उप-पेड़ों में हैं। HW पेज वॉक को प्रगति करने के लिए इन सभी अतिथि पृष्ठ-तालिका पृष्ठों को छूने की आवश्यकता होगी। यह स्थिति संयोग से होने की संभावना नहीं है।

TLB (और पेज-वॉकर इंटर्नल) को पेज-टेबल के कुछ डेटा को कैश करने की अनुमति दी जाती है, और जब तक ओएस ने invlpgनया CR3 शीर्ष-स्तरीय पेज डायरेक्टरी सेट या सेट नहीं किया, तब तक पेज-वॉक को फिर से शुरू करने की आवश्यकता नहीं है । पृष्ठ के वर्तमान से वर्तमान तक परिवर्तित करते समय न तो ये आवश्यक हैं; कागज पर x86 की गारंटी है कि इसकी आवश्यकता नहीं है (इसलिए वर्तमान में मौजूद पीटीई को "नकारात्मक कैशिंग" की अनुमति नहीं है, कम से कम सॉफ्टवेयर के लिए दृश्यमान नहीं है)। यदि कुछ अतिथि-भौतिक पृष्ठ-तालिका पृष्ठ वास्तव में मौजूद नहीं हैं, तो भी CPU VMexit नहीं हो सकता है।

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


15
एक एकल निर्देश के लिए सबसे खराब मामला कुछ ऐसा हो सकता है जैसे " push dword [foo" (या यहां तक ​​कि call [foo]) सब कुछ "पृष्ठ निर्देशिका सूचक तालिका सीमा" में गलत लिखा गया है (6 पृष्ठ, 6 पृष्ठ तालिका, 6 पृष्ठ निर्देशिका, 6 पीडीपीटी और एक पीएमएल 4 को जोड़कर); सीपीयू की "सटीक घटना आधारित नमूनाकरण पीईबीएस बफर के साथ" सुविधा सक्षम और कॉन्फ़िगर की गई ताकि pushप्रदर्शन निगरानी डेटा पीईबीएस बफर में जोड़ा जा सके। एक रूढ़िवादी के लिए "मेजबान द्वारा प्रदान किए गए न्यूनतम पृष्ठ इसलिए अतिथि पैथोलॉजिकल मामलों में प्रगति कर सकते हैं" मैं कम से कम 16 पृष्ठ चाहता हूं।
ब्रेंडन

4
ध्यान दें कि CISC-y आर्किटेक्चर में इस तरह की बात हमेशा आम रही है। कुछ माइक्रोप्रोसेसर आंशिक रूप से निर्देशों को डिकोड करते हैं और एक पेज की गलती पर माइक्रोक्रिस्टिस्टर स्टेट को डंप करते हैं, लेकिन दूसरों को "लूप-वाई" निर्देशों के लिए पता संचालन की आवश्यकता नहीं होती है और / या m68k पर DBRA, वैक्स आदि पर MOVC3 / MOVC5, रजिस्टरों में समान होते हैं। आपके REP MOVS उदाहरण के लिए।
torek

1
@ ब्रेंडन: किसी ने वैक्स इंस्ट्रक्शन पर लगभग 50 पृष्ठों में सबसे खराब स्थिति गिना। मैं विवरण भूल जाता हूं, लेकिन आप स्पष्ट रूप से निर्देश को एक पृष्ठ सीमा पर रख देंगे, पृष्ठ-सीमा के साथ तालिका के साथ ट्रांसलेशन-टेबल लुकअप का उपयोग करें, पृष्ठ सीमाओं पर अप्रत्यक्ष के साथ उपयोग (rX) [rY], और जल्द ही। मुझे लगता है कि 6 ऑपरेंड्स (उन्हें r0-r5 में लोड करना) और सभी छह डबल इनडायरेक्ट हो सकते हैं।
torek

3
ओएस निर्देश को बदल सकता है, लेकिन यह भी बदल सकता है EIP। तो एक तार्किक अनुवर्ती प्रश्न है। एक बुद्धिमान अनुदेश पैच योजना को मानकर आवश्यक पृष्ठों की न्यूनतम संख्या क्या है? उदाहरण के लिए संरेखित स्क्रैच बफ़र के लिए अनलॉन्ग किए गए मान को कॉपी करें, अनुदेश का अनुकरण करें, और अगले निर्देश पर IRET।
MSalters

1
ओएस के iretनिर्देश वाले पृष्ठ की आवश्यकता भी स्मृति में होती है। यह एक बाइट अनुदेश है, इसलिए एक अतिरिक्त पृष्ठ। पेज फॉल्ट हैंडलर इंटरप्ट एड्रेस की भी मेमोरी में जरूरत होती है, लेकिन यह ऊपर वाले पेज की तरह ही हो सकता है।
स्टिग हेमर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.