हां, उन्हें मशीन कोड और सभी मेमोरी ऑपरेंड की आवश्यकता होती है।
क्या 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
या movsw
2-बाइट अनुदेश एक पृष्ठ सीमा को फैलाता है, इसलिए इसे डिकोड करने के लिए दोनों पृष्ठों की आवश्यकता होती है।
- qword स्रोत ऑपरैंड
[rsi]
एक पृष्ठ-विभाजन भी करता है
- qword गंतव्य ऑपरेंड
[rdi]
भी एक पृष्ठ-विभाजन है
यदि इन 6 पृष्ठों में से कोई भी दोष है, तो हम वापस एक वर्ग में आते हैं।
rep movsd
एक 2-बाइट अनुदेश भी है, और इसके एक कदम पर प्रगति करने की समान आवश्यकता होगी। इसी तरह के मामलों की तरह है push [mem]
या pop [mem]
अनमेल ढेर के साथ निर्माण किया जा सकता है।
इकट्ठा लोड / स्कैटर स्टोर "इंटरटेबल" (उनकी प्रगति के साथ मुखौटा वेक्टर को अपडेट करना) बनाने के लिए कारणों (या साइड बेनिफिट्स) में से एक निर्देश को निष्पादित करने के लिए इस न्यूनतम पदचिह्न को बढ़ाने से बचना है। इसके अलावा एक इकट्ठा या बिखराव के दौरान कई दोषों से निपटने की दक्षता में सुधार करने के लिए।
@ ब्रैंड टिप्पणी में बताते हैं कि एक अतिथि को स्मृति में अपने पेज टेबल की आवश्यकता होगी , और उपयोगकर्ता-स्पेस पेज विभाजन 1GiB विभाजन भी हो सकते हैं, इसलिए दोनों पक्ष शीर्ष स्तर PML4 के विभिन्न उप-पेड़ों में हैं। HW पेज वॉक को प्रगति करने के लिए इन सभी अतिथि पृष्ठ-तालिका पृष्ठों को छूने की आवश्यकता होगी। यह स्थिति संयोग से होने की संभावना नहीं है।
TLB (और पेज-वॉकर इंटर्नल) को पेज-टेबल के कुछ डेटा को कैश करने की अनुमति दी जाती है, और जब तक ओएस ने invlpg
नया CR3 शीर्ष-स्तरीय पेज डायरेक्टरी सेट या सेट नहीं किया, तब तक पेज-वॉक को फिर से शुरू करने की आवश्यकता नहीं है । पृष्ठ के वर्तमान से वर्तमान तक परिवर्तित करते समय न तो ये आवश्यक हैं; कागज पर x86 की गारंटी है कि इसकी आवश्यकता नहीं है (इसलिए वर्तमान में मौजूद पीटीई को "नकारात्मक कैशिंग" की अनुमति नहीं है, कम से कम सॉफ्टवेयर के लिए दृश्यमान नहीं है)। यदि कुछ अतिथि-भौतिक पृष्ठ-तालिका पृष्ठ वास्तव में मौजूद नहीं हैं, तो भी CPU VMexit नहीं हो सकता है।
पीएमयू प्रदर्शन काउंटरों को सक्षम और कॉन्फ़िगर किया जा सकता है कि निर्देश को उस निर्देश के लिए पीईबीएस बफर में लिखने के लिए एक संपूर्ण घटना की भी आवश्यकता होती है । काउंटर के मास्क को केवल यूजर-स्पेस निर्देशों को गिनने के लिए कॉन्फ़िगर किया गया है, न कि कर्नेल के साथ, यह अच्छी तरह से हो सकता है कि यह हर बार जब आप उपयोगकर्ता-पृष्ठ पर वापस आते हैं, तो पेज-फॉल्ट का निर्माण करते हुए काउंटर को ओवरफ्लो करने और बफर में एक नमूना स्टोर करने की कोशिश करता रहता है।