2008-09-08 10 views
24

मेरे ओएस एक्स बॉक्स पर, कर्नेल 32 बिट बाइनरी है और फिर भी यह 64 बिट बाइनरी चला सकता है। यह कैसे काम करता है?32 बिट कर्नेल 64 बिट बाइनरी कैसे चला सकता है?

 
cristi:~ diciu$ file ./a.out 
./a.out: Mach-O 64-bit executable x86_64 
cristi:~ diciu$ file /mach_kernel 
/mach_kernel: Mach-O universal binary with 2 architectures 
/mach_kernel (for architecture i386): Mach-O executable i386 
/mach_kernel (for architecture ppc): Mach-O executable ppc 
cristi:~ diciu$ ./a.out 
cristi:~ diciu$ echo $? 
1 
+0

[32 बिट कर्नेल पर चलते समय ओएसएक्स 64 बिट बाइनरी कैसे चलाता है?] (Https://superuser.com/q/340549/241386) –

उत्तर

43

सीपीयू को 64 बिट निष्पादन मोड से 32 बिट तक स्विच किया जा सकता है जब यह कर्नेल संदर्भ में जालता है, और 64 बिट उपयोगकर्ता-स्पेस ऐप्स से पारित संरचनाओं को समझने के लिए 32 बिट कर्नेल का निर्माण अभी भी किया जा सकता है।

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

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

+1

क्या इसका मतलब यह है कि 32-बिट कर्नेल को 64-बिट पॉइंटर्स के बारे में पता होना चाहिए, क्योंकि इसे इसे परिवर्तित करना है? –

6

यह कर्नेल नहीं है जो बाइनरी चलाता है। यह प्रोसेसर है।

द्विआधारी कॉल लाइब्रेरी फ़ंक्शंस कॉल करता है और उन्हें 64 बिट होने की आवश्यकता होती है। और यदि उन्हें सिस्टम कॉल करने की आवश्यकता है, तो वे इस तथ्य से निपटने की अपनी ज़िम्मेदारी है कि वे स्वयं 64 बिट हैं, लेकिन कर्नेल केवल 32 है।

लेकिन ऐसा कुछ नहीं है जिसके बारे में आपको चिंता करना होगा।

0

कर्नेल 64-बिट होने के लिए केवल प्रभावी लाभ लाएगा कि कर्नेल एक्सटेंशन (यानी, आमतौर पर ड्राइवर) 64-बिट हो सकते हैं। असल में, आपको सभी 64-बिट कर्नेल एक्सटेंशन, या (जैसा अब मामला है) सभी 32-बिट वाले होना चाहिए; उन्हें चल रहे कर्नेल की वास्तुकला के मूल निवासी होने की आवश्यकता है।

+0

और जब तक सस्ते हार्डवेयर को सस्ते तृतीय पक्ष ड्राइवरों की आवश्यकता होती है, तो नहीं 64 बिट कर्नेल जल्द ही होने की उम्मीद है :-) – pilif

+0

64-बिट विंडोज़ को 64-बिट ड्राइवरों की आवश्यकता होती है, और कर्नेल 64-बिट मोड में चलता है। आप 64-बिट विंडोज़ पर 32-बिट ड्राइवर नहीं चला सकते हैं। उपरोक्त उदाहरण ओएस एक्स है, जिसमें 32-बनाम 64-बिट संस्करण नहीं है (केवल 64-बिट ऐप्स को 6464 बिट/32-बिट कर्नेल पर चलाने की क्षमता है)। –

+0

एनटी और ओएसएक्स दोनों माइक्रो-कर्नेल पर चलते हैं, जो संदेश भेजते समय 32 <-> 64 बिट मोड स्विच कर सकते हैं। हालांकि यह चीजों को धीमा कर देगा। –

2

32 बिट कर्नेल जो 64 बिट बाइनरी लोड करने और चलाने में सक्षम है, मेमोरी मैपिंग, प्रोग्राम लोडिंग और कुछ अन्य 64 बिट मुद्दों को संभालने के लिए कुछ 64 बिट कोड होना चाहिए।

हालांकि, अन्य मुद्दों से निपटने के लिए शेड्यूलर और कई अन्य ओएस संचालन को 64 बिट मोड में काम करने की आवश्यकता नहीं है - यह प्रोसेसर को 32 बिट मोड में स्विच करता है और ड्राइवरों, कार्यों, मेमोरी आवंटन और मैपिंग, इंटरप्ट्स इत्यादि।

वास्तव में, ओएस जो 64 बिट्स पर किसी भी तेजी से चलने की ज़रूरत नहीं करता है - ओएस एक भारी डेटा प्रोसेसर नहीं है, और वे भाग जो हैं (स्ट्रीम, डिस्क I/O, आदि) की संभावना 64 बिट (प्लगइन को ओएस में वैसे भी) में परिवर्तित कर दिया जाता है।

लेकिन नंगे कर्नेल स्वयं 64 बिट होने पर, किसी भी तेज़ स्विच आदि को स्विच नहीं करेगा।

यह विशेष रूप से ऐसा मामला है जब अधिकांश लोग अभी भी 32 बिट ऐप्स चला रहे हैं, इसलिए मोड स्विचिंग की हमेशा आवश्यकता नहीं होती है, भले ही यह कम ओवरहेड ऑपरेशन हो, इसमें कुछ समय लगता है।

-Adam

6

ध्यान दें कि नहीं सभी 32-बिट कर्नेल 64-बिट चल रही प्रक्रियाओं में सक्षम हैं। विंडोज़ में निश्चित रूप से यह संपत्ति नहीं है और मैंने कभी इसे लिनक्स पर नहीं देखा है।

+1

विषय पंक्ति नहीं है, लेकिन ओएसएक्स टैग करता है। – gabr

+0

समझ गया - मुझे याद आया। उम्मीद है कि तुलना इस प्रश्न पर अन्य ठोकर के लिए उपयोगी होगी। मैं थोड़ा सा पाठ संपादित करूंगा। –

+0

लिनस इस कार्यक्षमता को लिनक्स में कभी भी अनुमति नहीं देगा, उसने पीएई पर भी फिट किया था। –

1

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

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