.net - How is JIT compiled code injected in memory and executed? -


"एक विशिष्ट विंडोज़ x86 या AMD64 आर्किटेक्चर पर विचार करें, मेमोरी को एक्जीक्यूटेबल सेक्शन में विभाजित किया जाता है जिसे लिखित नहीं किया जा सकता है डेटा अनुभाग जिन्हें लिखा जा सकता है, लेकिन निष्पादित नहीं किया जा सकता है (डीईपी सोचें)। "

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

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

जेआईटी-डिजाइनरों ने इस बाधा को कैसे दूर किया? क्या वे एक अंगूठी -0 चालक का उपयोग करते हैं या सब कुछ उपयोगकर्ता मोड में किया जाता है?

यह बस के साथ किया जाता है विंडोज़ वर्चुअलप्रोटेक्ट () एपीआई फ़ंक्शन यह आभासी स्मृति पृष्ठ विशेषताओं को बदलता है PAGE_READWRITE से तो JIT कंपाइलर मशीन कोड को PAGE_EXECUTE_READ लिख सकता है ताकि इसे निष्पादित किया जा सके। ऐसा करने के लिए कोई विशेष विशेषाधिकारों की आवश्यकता नहीं है क्योंकि पृष्ठ की प्रक्रिया के स्वामित्व में है जो कि जेआईटी कंपाइलर चलाता है।


Comments

Popular posts from this blog

c# - sqlDecimal to decimal clr stored procedure Unable to cast object of type 'System.Data.SqlTypes.SqlDecimal' to type 'System.IConvertible' -

Calling GetGUIThreadInfo from Outlook VBA -

Obfuscating Python code? -