64-बिट कर्नेल, लेकिन सभी 32-बिट ईएलएफ निष्पादन योग्य प्रक्रियाएं, यह कैसे है?


9

से उत्पादन uname:

root@debian:~ # uname -a
Linux 5asnb 2.6.32-5-amd64 #1 SMP Mon Jun 13 05:49:32 UTC 2011 x86_64 GNU/Linux

हालाँकि /sbin/initनिष्पादन योग्य 32-बिट के रूप में दिखाई देता है:

root@debian:~ # file /sbin/init
/sbin/init: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped

सिस्टम के अन्य पहलू भी विरोधाभासी बातें प्रतीत होते हैं:

root@debian:~ # echo $HOSTTYPE
i486

root@debian:~ # getconf LONG_BIT
32

जवाबों:


13

64 बिट कर्नेल को डेबियन 32 बिट पर स्थापित किया जा सकता है। आप देख सकते हैं कि amd64 कर्नेल 32 बिट डेबियन के लिए पैकेज पृष्ठ पर उपलब्ध है । यह कुल रैम के 4 जी से अधिक का समर्थन करने के लिए पीएई सक्षम कर्नेल का उपयोग करने के विकल्प के रूप में उपयोग किया जा सकता है। ध्यान दें कि 32 बिट बायनेरिज़ अभी भी लगभग 3 जी रैम प्रति प्रक्रिया से अधिक का उपयोग नहीं कर सकते हैं।


धन्यवाद! आपके उत्तर क्रिस्टल बॉल के समान स्पष्ट हैं ~: डी ने पहले कभी इस तरह से कर्नेल पैकेज का ध्यान नहीं दिया।
कीवी

1
यह सच नहीं है: 32-बिट प्रोग्राम 64-बिट कर्नेल पर चलने पर (जब तक कि वे ADDR_LIMIT_3GB व्यक्तित्व के साथ नहीं चल रहे हैं) अपने वर्चुअल एड्रेस स्पेस के पूरे 4Gio का उपयोग कर सकते हैं।
ysdx

@ysdx तो 2GB तक सीमित एक विंडोज विशिष्ट चीज है और 0x80000000 से ऊपर के पते 32-बिट उपयोगकर्तास्पेस में अनुमति दी जाएगी?
पॉल स्टेलियन

1
@PaStStelian, 32 बिट विंडोज पर, आप डिफ़ॉल्ट रूप से रेट्रो-कम्पैटिबिलिटी के लिए सबसे कम 2GB की वर्चुअल मेमोरी तक सीमित हैं (मुझे लगता है कि कुछ प्रोग्राम पॉइंटर्स को विशेष उद्देश्य के लिए उच्चतम 2GB की वर्चुअल मेमोरी में आरक्षित करते थे)। आप अपने निष्पादन योग्य ( docs.microsoft.com/fr-fr/cpp/build/reference/… ) में LARGEADDRESSAWARE ध्वज सेट कर सकते हैं ताकि वर्चुअल मेमोरी के पूरे 4GB तक पहुँच प्राप्त कर सकें
ysdx

15

सभी प्रोसेसर जो x64 निर्देश सेट (जिसे x86_64 या amd64 के रूप में भी जाना जाता है) का समर्थन करते हैं, x86 अनुदेश सेट (जिसे i386 या i686 भी कहा जाता है, जो कड़ाई से x86 के विशिष्ट संस्करण बोल रहे हैं ) का समर्थन करते हैं। वही ARM A64 (ARMv8 में दिखने वाला नया 64-बिट इंस्ट्रक्शन सेट) और A32 ("क्लासिक" 32-बिट इंस्ट्रक्शन सेट के लिए नाम ), SPARC64 और SPARC के लिए जाता है , और मैं MIPS64 और MIPS के लिए विश्वास करता हूं । तो इन सभी आर्किटेक्चर परिवारों पर, यदि कोई प्रोसेसर 64-बिट कोड चला सकता है, तो यह 32-बिट कोड भी चला सकता है।

लिनक्स कर्नेल 64-बिट कर्नेल के साथ 32-बिट यूजरलैंड कोड चलाने का समर्थन करता है (ऊपर वर्णित सभी वास्तुकला परिवारों पर, मुझे लगता है)। कर्नेल सजातीय होना चाहिए (सभी 64-बिट या सभी 32-बिट), और प्रत्येक प्रक्रिया सजातीय होनी चाहिए, लेकिन आपके पास 64-बिट कर्नेल पर 32-बिट और 64-बिट प्रक्रियाओं का मिश्रण हो सकता है। आक्षेप संभव नहीं है: 32-बिट कर्नेल के साथ, आप 64-बिट प्रक्रिया नहीं चला सकते हैं।

यह लिनक्स में एक डिज़ाइन पसंद है, जो 64-बिट इंस्टॉलेशन पर मौजूदा 32-बिट बायनेरिज़ को चलाने की इच्छा से प्रेरित है। अन्य यूनिक्स वेरिएंट ने अलग-अलग विकल्प बनाए हैं: सोलारिस 32-बिट कर्नेल पर 64-बिट प्रोग्राम के साथ-साथ दूसरे तरीके से भी चल सकता है, जबकि ओपनबीएसडी 64-बिट कर्नेल पर 32-बिट प्रोग्राम नहीं चला सकता है।

आप प्राप्त कर सकते हैं सीपीयू के बारे में जानकारी में /proc/cpuinfo। यदि आपके x86 CPU में lmध्वज है, तो यह 64-बिट CPU है।

डिफ़ॉल्ट रूप से, uname -mया archआर्किटेक्चर दिखाता है कि कर्नेल के लिए संकलित किया गया था। लिनक्स प्रक्रिया के "व्यक्तित्व" को personalityसिस्टम कॉल के साथ सेट कर सकता है । आप setarchकमांड के साथ एक अलग व्यक्तित्व में एक उपप्रकार चला सकते हैं ; setarch i686 someprogramया linux32 someprogramनिर्दिष्ट प्रोग्राम को ऐसे वातावरण में चलाता है, जहाँ uname -mरिटर्न i686करते समय setarch amd64 someprogramया linux64 someprogramनिर्दिष्ट प्रोग्राम को ऐसे वातावरण में चलाता है जहाँ uname -mरिटर्न देता है amd64

file /sbin/initआपको बताता है कि initकार्यक्रम किस वास्तुकला के लिए संकलित है। यद्यपि एक इंस्टॉलेशन में 32-बिट और 64-बिट निष्पादन योग्य मिश्रण करना संभव है, आमतौर पर सभी कोर ओएस प्रोग्राम एक ही वास्तुकला से होते हैं, क्योंकि इसे प्रबंधित करना बहुत आसान है।

$HOSTYPEएक बैश वैरिएबल है और आपको बताता है कि bashप्रोग्राम को किस आर्किटेक्चर के लिए संकलित किया गया था।

getconf LONG_BITक्या आप जानते हैं कि 32-बिट या 64-बिट प्रोग्राम को संकलित करने के लिए डिफ़ॉल्ट C कंपाइलर सेट किया गया है या नहीं। एक अधिक सटीक परीक्षण एक प्रोग्राम को संकलित करना और चलाना है जो प्रिंट sizeof(void*)या sizeof(size_t)- कॉलिंग getconfकेवल इस बारे में जानकारी दे सकता getconfहै कि डिफ़ॉल्ट कंपाइलर क्या है।


1
वास्तव में, 32 बिट सोलारिस 64-बिट प्रक्रिया में स्विच करने के लिए 64 बिट मोड पर स्विच करता है और फिर वापस? यह एक विशाल उपरि होना चाहिए, और बस कोई मतलब नहीं है, क्योंकि तब कर्नेल प्रभावी रूप से 64 बिट है।
रुसलान

1
@Ruslan इसका भारी ओवरहेड क्यों होगा? एक संदर्भ स्विच पर मोड स्विच करने से बहुत अधिक खर्च नहीं होता है (अगर कुछ भी, मुझे x86 कम स्तर पर अच्छी तरह से पता नहीं है)। कर्नेल 32-बिट रहता है: कर्नेल मैपिंग के लिए 32-बिट वर्चुअल एड्रेस, 32-बिट इंस्ट्रक्शन सेट का उपयोग।
गिल्स एसओ- बुराई को रोकना '

1
कर्नेल को 64 बिट ऐप्स, कम से कम 64 बिट-जागरूक पृष्ठ तालिकाओं का समर्थन करने के लिए 64-बिट-विशिष्ट डेटा संरचनाओं को बनाए रखना चाहिए। यह वास्तव में एक 32 बिट कर्नेल नहीं बनाता है। मैंने amd64 आर्च में वास्तव में गहराई से जाने की कोशिश नहीं की है, लेकिन मुझे लगता है कि 64 बिट समर्थन बंद करने से विशेष रूप से डिज़ाइन की गई संगतता मोड का उपयोग करने के विपरीत काफी ओवरहेड होगा।
रुस्लान

1
@Ruslan केवल 64-बिट जागरूक पेज टेबल और वास्तव में आवश्यक है, और यह एक छोटी लागत है। सही कर्नेल डिजाइन के साथ बाकी सभी चीजों से बचा जा सकता है। मैंने सोलारिस कर्नेल में कभी नहीं खोदा है, मुझे लगता है कि उन्होंने इसे पर्याप्त रूप से लचीला बनाने की व्यवस्था की थी (उन्हें SPARC64 के साथ पूर्व अनुभव था)।
गाइल्स का SO- बुराई पर रोक '
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.