2012-04-30 8 views
10

मुझे लगता है कि मेरा प्रश्न CLR लोडर के बारे में है। मैं CorFlags.exe/32BIT+ कार्यक्षमता के पीछे यांत्रिकी को समझना चाहता हूं।CorFlags.exe/32BIT + कैसे काम करता है?

हम जानते हैं कि जब कोई के साथ संकलित एक असेंबली शुरू करता है तो 64-बिट विंडोज़ पर कोई भी CPU ध्वज सेट, यह 64-बिट प्रक्रिया के रूप में शुरू होता है। यदि कोई उस असेंबली पर CorFlags /32BIT+ चलाता है, तो यह 32-बिट प्रक्रिया के रूप में शुरू होगा। मुझे लगता है कि यह एक आकर्षक विशेषता है।

  1. यह कैसे कार्यान्वित किया जाता है:

    मैं इसके बारे में बहुत सारे प्रश्न हैं?

  2. क्या ओएस लोडर शामिल हो जाता है?
  3. कि एक इच्छा पर 32-बिट या 64-बिट CLR लोड करता है एक कस्टम अनुप्रयोग (मैं एक अप्रबंधित एक अनुमान) का निर्माण करना संभव है?

क्या कोई लेख, पुस्तक, ब्लॉग इत्यादि है जो इस सुविधा के आंतरिक कार्यों को समझाता है?

उत्तर

5

यह अच्छी तरह से किसी भी जगह मैं के बारे में पता में दर्ज नहीं है, मैं केवल एक प्रासंगिक MSDN लेख के लिए आप बात कर सकते हैं। हां, आपकी धारणा सही है, विंडोज एक्सपी और लोडर में लोडर को प्रबंधित एक्जिक्यूटिव के बारे में जागरूकता है। यह स्वचालित रूप से .NET लोडर शिम (c: \ windows \ system32 \ mscoree.dll) लोड करता है, प्रासंगिक प्रविष्टि बिंदु _CorValidateImage() है। जुड़ा हुआ MSDN लेख में टिप्पणी खंड तंत्र है कि एक 64-बिट प्रक्रिया में एक 32-बिट exe फ़ाइल बदल जाता है वर्णन करता है:

Windows XP और बाद के संस्करणों, का परीक्षण करके कामयाब मॉड्यूल के लिए ऑपरेटिंग सिस्टम लोडर चेकों में सामान्य ऑब्जेक्ट फ़ाइल प्रारूप (सीओएफएफ) शीर्षलेख में COM Descriptor निर्देशिका बिट। एक सेट बिट एक प्रबंधित मॉड्यूल इंगित करता है। लोडर एक प्रबंधित मॉड्यूल का पता लगाता है, तो यह mscoree.dll लोड करता है और कहता है _CorValidateImage है, जो निम्नलिखित कार्य करता है:

  • पुष्टि उस छवि को एक मान्य प्रबंधित मॉड्यूल है।
  • सामान्य भाषा रनटाइम (सीएलआर) में एक प्रविष्टि बिंदु पर छवि में प्रवेश बिंदु बदलता है।
  • Windows के 64-बिट संस्करण के लिए, छवि यह PE32 से PE32 + प्रारूप करने के लिए बदलने से स्मृति में है कि संशोधित करता है।
  • प्रबंधित मॉड्यूल छवियों को लोड होने पर लोडर पर वापस आता है।

निष्पादन चित्रों के लिए, ऑपरेटिंग सिस्टम लोडर तो _CorExeMain फ़ंक्शन को कॉल करने, निष्पादन में निर्दिष्ट प्रवेश बिंदु की परवाह किए बिना। डीएलएल असेंबली छवियों के लिए, लोडर _CorDllMain फ़ंक्शन को कॉल करता है।

_CorExeMain या _CorDllMain निम्नलिखित कार्य करता है:

  • CLR आरंभीकृत।
  • असेंबली के सीएलआर हेडर से प्रबंधित एंट्री पॉइंट का पता लगाता है।
  • निष्पादन शुरू होता है।

लोडर _CorImageUnloading समारोह जब कामयाब मॉड्यूल छवियों उतारे जा रहे हैं कहते हैं।हालांकि, यह फ़ंक्शन कोई क्रिया नहीं करता है; यह सिर्फ लौटता है।

+0

त्वरित उत्तर के लिए धन्यवाद। यह एक अच्छा प्रारंभिक बिंदु है। मैं यह जानना चाहता था कि clr .reloc सेक्शन कैसे करता है। मैंने sscli में खोला, ज्यादातर pedecoder.h/pewriter.cpp में और मेरे उत्तरों को मिला। फिर भी कई प्रश्न हैं (उदाहरण के लिए विंडोज 2000 x64 के बारे में क्या) लेकिन मुझे लगता है कि मुझे एसएससीआई में जवाब मिलेंगे। –

+0

यह एक आसान है, विंडोज 2000 x64 को आखिरी सफेद यति द्वारा उपयोग किया गया है। –

+1

वाह। मुझे आश्चर्य है कि विंडोज के लिए उचित वसा (देशी कोड) बाइनरी बनाने के लिए इस "विशेष जागरूकता" का लाभ उठाने का कोई तरीका है या नहीं। – Fowl

2

हंस के उत्तर में जोड़ने के लिए, कुछ फ़्लैश कर्नेल मोड कोड भी हैं जो उस ध्वज का जवाब देते हैं। प्रत्येक भारित निष्पादन योग्य में कर्नेल संरचना होती है, SECTION_IMAGE_INFORMATION, इसके साथ जुड़ा हुआ है। यहाँ अपने प्रतीक जानकारी है:

0: kd> dt nt!_SECTION_IMAGE_INFORMATION 
      +0x000 TransferAddress   : Ptr64 Void 
      +0x008 ZeroBits     : Uint4B 
      +0x010 MaximumStackSize   : Uint8B 
      +0x018 CommittedStackSize  : Uint8B 
      +0x020 SubSystemType    : Uint4B 
      +0x024 SubSystemMinorVersion  : Uint2B 
      +0x026 SubSystemMajorVersion  : Uint2B 
      +0x024 SubSystemVersion   : Uint4B 
      +0x028 GpValue     : Uint4B 
      +0x02c ImageCharacteristics  : Uint2B 
      +0x02e DllCharacteristics  : Uint2B 
      +0x030 Machine     : Uint2B 
      +0x032 ImageContainsCode   : UChar 
      +0x033 ImageFlags    : UChar 
      +0x033 ComPlusNativeReady  : Pos 0, 1 Bit 
      +0x033 ComPlusILOnly    : Pos 1, 1 Bit 
      +0x033 ImageDynamicallyRelocated : Pos 2, 1 Bit 
      +0x033 ImageMappedFlat   : Pos 3, 1 Bit 
      +0x033 BaseBelow4gb    : Pos 4, 1 Bit 
      +0x033 Reserved     : Pos 5, 3 Bits 

झंडे ComPlusILOnly और ComPlusNativeReady नेट से जुड़े हुए हैं, ComPlusILOnly बस पता चलता है कि विधानसभा CIL केवल (मिश्रित या देशी नहीं - जो मामले में विधानसभा को पहले से ही वास्तुकला विशिष्ट है) है, और ComPlusNativeReady केवल 1 है यदि/32 बीआईटी + सेट नहीं है (32BITREQ or 32BITPREF in newer CorFlags version)। उन झंडे को nt!PspAllocateProcess के दौरान चेक किया गया है और उनके आधार पर 32-bit या 64-bit प्रक्रिया बनाई गई है।

I wrote about it कुछ विवरणों के साथ।

+0

बहुत धन्यवाद !!! मैं Windows NT/2000 मूल API संदर्भ में अप्रचलित जानकारी का उपयोग करके इस संरचना के कुछ ऑफसेट फ़ील्ड की गणना करने में उलझन में हूं। –

संबंधित मुद्दे