64 बिट OS 16 बिट अनुप्रयोग क्यों नहीं चला सकता है?


38

ऐसा क्यों है:

  • 32-बिट OS, जब 64-बिट CPU पर स्थापित किया जाता है, तो पुराने 16-बिट अनुप्रयोग चला सकते हैं,
  • लेकिन अगर आप 64-बिट OS स्थापित करते हैं, तो यह उन अनुप्रयोगों को सीधे नहीं चला सकता है और किसी प्रकार के अनुकरण की आवश्यकता होती है (जो हमेशा पूरी तरह से काम नहीं करता है)?

अधिक विशिष्ट होने के लिए, मेरे पास 64-बिट प्रोसेसर (इंटेल कोर 2 डुओ) है। जब मेरे पास विंडोज एक्सपी और विंडोज 7 (दोनों 32-बिट) स्थापित थे, तो वे पुराने डॉस और 616-बिट विंडोज एप्लिकेशन चला सकते थे।

अब मैंने विंडोज 7 का 64-बिट संस्करण स्थापित किया है। यह अब उन्हीं अनुप्रयोगों को क्यों नहीं चला सकता है?


3
मुझे लगता है कि बिट्स के साथ कम और अतिथि ऑपरेटिंग सिस्टम के साथ अधिक करना है। ओएस क्या आप विशेष रूप से बात कर रहे हैं?
पीकाका

क्या यह डॉसबॉक्स के तहत चलेगा?
पेंगुइन

1
एक उपयोगिता है जिसे DOSBOX कहा जाता है इसका 16 बिट एमुलेटर है जो आपके 16 बिट प्रोग्राम को काम करने के लिए वर्चुअल 16 बिट कंप्यूटर देता है और यह मुफ़्त है।

मैं मानता हूँ पेका साथ, तथ्य यह है कि एक 64-बिट (हार्डवेयर) प्रणाली है सकते हैं (यदि ओएस तो डिजाइन किए गए थे यहां तक कि 1-बिट कोड ओह,) 16-बिट कोड चलाते हैं। असली पकड़ यह है कि विभिन्न संकेतक आकार जैसी चीजों के कारण सीपीयू सीधे 16-बिट कोड को नहीं चला सकता है , लेकिन इन मुद्दों को ओएस द्वारा अलग किया जा सकता है। सीमा एक कृत्रिम है जिसे माइक्रोसॉफ्ट ने चीजों को सरल बनाने के लिए लगाया है (हालांकि वे अभी भी 32-बिट का अनुकरण करते हैं क्योंकि अभी भी 32-बिट कोड है)। अन्य OSes (* निक्स?) हैं जो 16-बिट कोड को बिना समस्या के चला सकते हैं।
20

आप सभी ओएस के साथ विंडोज को भ्रमित कर रहे हैं।
केन शार्प

जवाबों:


24

मेरी समझ से, ऐसा इसलिए है क्योंकि लॉन्ग मोड (x64 नेटिव) में चलने पर, CPU स्वयं 16 बिट मोड में जाने का समर्थन नहीं करता है। विकिपीडिया देखें । तो, 16 बिट मोड का समर्थन करने के लिए, NTVDM (विंडोज में 16 बिट परत) को 16 बिट प्रोसेसर का पूरी तरह से अनुकरण करना होगा।

मुझे लगता है कि वे इसे फिर से लागू करने के लिए पहले से मौजूद वर्चुअलाइजेशन सॉफ्टवेयर (VirtualPC, VirtualBox) का उपयोग करके एक एमुलेशन लेयर को फिर से लागू कर रहे हैं और वीडीएम में कटौती करने का निर्णय लिया गया।


6
विकिपीडिया से उद्धरण : 64-बिट आर्किटेक्चर (x64 और IA-64) के लिए Windows NT के संस्करण में NTVDM शामिल नहीं है और DOS या 16-बिट Windows अनुप्रयोग चलाने में असमर्थ हैं। ऐसा इसलिए है, क्योंकि x86-64 CPU में, वर्चुअल 8086 मोड केवल इसकी लीगेसी मोड (16- और 32-बिट ऑपरेटिंग सिस्टम चलाने के लिए) में उप-मोड के रूप में उपलब्ध है, देशी में नहीं, 64-बिट लॉन्ग मोड में; विरासत मोड में स्विच करने के लिए सीपीयू का एक हार्ड रीसेट आवश्यक है। तो एक ही रास्ता है कि एनटीवीडीएम ने अब तक कैसे काम किया है, अब उपलब्ध नहीं है और पूर्ण वीएम वहाँ से बाहर हैं, इसलिए एनटीवीडीएम को काट दिया गया।
जॉय

5
हाँ, मैं विश्वास नहीं कर सकता कि उन्होंने V86 मोड को डंप किया। हो सकता है कि आप वास्तविक मोड को पूरी तरह से टॉस करें और यदि आप ऐसा करने जा रहे हैं तो 32/64 बिट बूट लोडर की मांग करें।
ब्रायन नोब्लुच

5
यह वही है जो पहले ही हो चुका है, एम। नोबलच। EFI फर्मवेयर के साथ एक आधुनिक x86 मशीन अपने पहले कुछ निर्देशों में 64/32-बिट संरक्षित मोड में असत्य मोड से सीधे जाती है। बूट लोडर वास्तव में 64/32-बिट संरक्षित मोड प्रोग्राम हैं। यही EFI बूट अनुप्रयोग हैं। इस प्रक्रिया में कहीं भी वास्तविक मोड या v8086 संरक्षित मोड का कोई उपयोग नहीं है।
जेडीबीपी

3
-1। वाइन 64-बिट लिनक्स पर VM86 मोड में 16-बिट विंडोज ऐप चलाने का समर्थन करता है। स्क्रीनशॉटV86-64 प्रोजेक्ट पेज । मेहरदाद का उत्तर अधिक सम्मोहक कारण जैसा लगता है।
ह्यूग एलन

3
@HughAllen: वह पृष्ठ वर्तमान में कहता है "वर्तमान में लिनक्स कर्नेल के 64-बिट संस्करण में V86 मोड का समर्थन नहीं है क्योंकि यह इन प्रोसेसर के देशी ऑपरेटिंग मोड (लंबी मोड) में समर्थित नहीं है।" और "यह पैच बहुत प्रयोगात्मक है ।" संक्षिप्त उत्तर यह है कि यद्यपि 16-बिट कोड को चलाना संभव है, लेकिन पूरी तरह से लंबे मोड से बाहर निकलने के बाद, ऐसा करना समझदारी नहीं है।
हैरी जॉनसन

14

क्योंकि 64-बिट हैंडल में 32 महत्वपूर्ण बिट्स हैं :

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

विंडोज में, प्रोग्राम ओएस और इसके विपरीत "हैंडल" के आसपास से गुजरते हैं (जो कि एक विशेष संसाधन, जैसे कि एक खिड़की की पहचान करने के लिए ओएस का उपयोग करता है)।

16-बिट कार्यक्रमों का समर्थन करने के लिए, 32-बिट विंडोज केवल एक हैंडल उत्पन्न करता है जिसमें 16 महत्वपूर्ण बिट्स होते हैं - 16 ऊपरी बिट्स को ओएस द्वारा अनदेखा किया जाता है (भले ही प्रोग्राम इस तथ्य का लाभ नहीं उठा रहे हों)। इसलिए कोई भी कार्यक्रम 2 से अधिक 16 वस्तुओं के साथ बातचीत नहीं कर सकता है , जो वास्तव में कम है।

हालाँकि, इसे बेहतर बनाने के लिए, 64-बिट विंडोज ने 32 बिट के हैंडल में महत्वपूर्ण बिट्स की संख्या में वृद्धि की। लेकिन अब इसका मतलब है कि जानकारी के नुकसान के बिना हैंडल को 16-बिट प्रोग्राम में पारित नहीं किया जा सकता है। तो 16-बिट प्रोग्राम 64-बिट विंडोज पर नहीं चल सकते।


3
@ जॉय: मुझे समझ नहीं आ रहा है कि आप क्या कह रहे हैं। यदि ओएस 64-बिट विंडोज है, तो 16-बिट एप्लिकेशन उस पर नहीं चल सकते हैं। मैं नहीं देखता कि कैसे तथ्य यह है कि वे "डॉस" या "विंडोज" एप्लिकेशन यहां कुछ भी बदलते हैं - किसी भी तरह से, हैंडल को एप्लिकेशन द्वारा छंटनी की आवश्यकता होगी।
मेहरदाद

1
डॉस अनुप्रयोगों में कोई हैंडल नहीं है। वास्तव में, वे (आमतौर पर) यह भी नहीं जानते कि वे विंडोज पर चल रहे हैं।
जॉय

1
... वास्तव में, यहां तक ​​कि Win16 कोड भी एक समस्या का बहुत अधिक नहीं होना चाहिए, अब जब कि मैं इसके बारे में सोचता हूं। आपको बस एक लुकअप टेबल चाहिए।
हैरी जॉन्सटन

1
@ हैरी जॉनसन: मुझे लगता है कि आप समस्या को याद कर रहे हैं। जब आप एक आवेदन कॉल करते हैं EnumWindowsऔर सिस्टम में 2 ^ 16 से अधिक विंडो होते हैं, तो आपको अपनी काल्पनिक "लुकअप टेबल" के साथ क्या करना चाहिए ?
मेहरदाद

1
मैं लेख के अनुसार कर्नेल हैंडल के बारे में बात कर रहा था, न कि विंडो हैंडल। वे पूरी तरह से अलग चीजें हैं। क्या 16-बिट एप्लिकेशन 32-बिट विंडो भी देखते हैं? यह संभव नहीं लगता है, क्योंकि संदेश संरचनाएं अलग हैं; यदि 16-बिट ऐप को 32-बिट wParam के साथ एक संदेश भेजा गया तो क्या होगा? इसके अलावा, टिप्पणी खिड़की हैंडल की अधिकतम संख्या अभी भी 2 ^ 16 के अनुसार है कि msdn.microsoft.com/en-us/library/windows/desktop/...
हैरी जॉनसन

10

विंडोज के लिए, यह इसलिए है क्योंकि ओएस के x86 संस्करणों में 16-बिट एमुलेशन शामिल है जो उन्हें उन पुराने डॉस प्रक्रियाओं को चलाने की अनुमति देता है। X64 संस्करणों में, उन्हें पहले से ही x86 निष्पादन का अनुकरण करना होगा (वे इसे वाह कहते हैं) 32-बिट प्रक्रियाओं को चलाने की अनुमति देने के लिए, और मुझे लगता है कि Wow64 का उपयोग करके 16-बिट एमुलेटर का अनुकरण करने के लिए बहुत अधिक समस्याएं पैदा हुईं।

मुट्ठी भर मान्यता प्राप्त 16-बिट प्रक्रियाएं चलेंगी क्योंकि उन्हें संभालने के लिए अनुकरण कठिन है, लेकिन बाकी काम नहीं करते क्योंकि अनुकरण x64 में शामिल नहीं है।

MSKB लेख में "नो 16-बिट कोड" देखें: http://support.microsoft.com/kb/282423


14
कोई अनुकरण नहीं चल रहा है - x86 / 64 इन चीजों को मूल रूप से चला सकता है। हालांकि, एपीआई थनकिंग चल रहा है। Microsoft ने इस अवसर को एक बहुत पुरानी और अधिकतर अप्रयुक्त तकनीक को रिटायर करने के लिए चुना है।
क्रिस के

@ क्रिस Kaminski - मुझे आश्चर्य है कि वे ऐसा करेंगे कि आर्किटेक्चर के निर्णय के रूप में - x86 बनाम x64 - जैसा कि "ठीक है - यह विंडोज 7 है, और हम 16-बिट प्रक्रियाओं को नहीं चला रहे हैं"। विशेष रूप से "विंडोज एक्सपी मोड" के साथ अब 7 में एम्बेडेड है, यह x86 संस्करण में भी समर्थन में कटौती करने का सही समय लगता है।
SqlRyan

@ क्रिस कमिंसकी: इसे कुछ और विचार देने के बाद, मुझे लगता है कि इसका अनुकरण करना होगा, न कि किसी तरह का एपीआई-मैकिंग। यदि यह अलग-अलग बिट-बिल्ड के कोड को मूल रूप से चला सकता है, तो x64 के पास 32-बिट ऐप चलाने के लिए Wow64 क्यों होगा - जो मूल रूप से भी नहीं चलाते हैं?
SqlRyan

@darthcoder: सीपीयू एनटीवीडीएम द्वारा लंबे (64 बिट) मोड में आवश्यक वर्चुअल 8086 मोड का समर्थन नहीं करता है। इसलिए या तो एनटीवीडीएम को पूर्ण वीएम बनना होगा, सब कुछ अनुकरण करना होगा या कटौती करनी होगी। चूंकि वहां पहले से ही पर्याप्त वीएम हैं (और एमएस में एक भी है) जो एक कठिन निर्णय नहीं था। मुझे नहीं लगता कि इसका कितना पुराना है या कितना उपयोग किया गया है, इसका कुछ भी नहीं है।
जॉय

rwmnau: WoW64 के लिए कोई अनुकरण नहीं चल रहा है (Itanium को छोड़कर)। x64-64 CPU अभी भी 32-बिट निर्देशों का समर्थन करते हैं, इसलिए लगभग सभी विंडोज़ को CPU को 32-बिट मोड में स्विच करना और कुछ पॉइंटर्स के साथ गड़बड़ करना है।
जॉय

3

गलत होने पर मुझे सही करें, लेकिन मेरी समझ से यह सिर्फ विंडोज-विशिष्ट समस्या के कारण है कि एनटीवीडीएम वर्चुअल 8086 मोड का उपयोग कर रहा है। X64 प्रोसेसर पर संगतता मोड (लंबे मोड में चल रहा है) पूर्ण 'क्लीन' संरक्षित मोड का समर्थन करता है, जो मैंने यहां पाया है , उससे 16 और 32 बिट: http://en.wikipedia.org/wiki/Long_mode , लेकिन कुछ नहीं वर्चुअल 8086 मोड जैसे 386 अतिरिक्त। तो यह सबसे अधिक संभावना का समर्थन नहीं करता है क्योंकि यह माइक्रोसॉफ्ट के लिए एनटीवीडीएम को फटकारने के लिए भुगतान नहीं करता है, जिसे संभवतः कुछ और अनुकरण जोड़ने की आवश्यकता होगी क्योंकि कुछ 16-बिट संरक्षित मोड एप्लिकेशन वर्चुअल 8086 का उपयोग कर सकते हैं, भले ही अधिकांश नहीं। मुझे लगता है कि पर्याप्त श्रम के साथ यह संभव है कि लंबे मोड में चलने वाले डॉक्सबॉक्स की तुलना में तेजी से कुछ लिखा जाए, क्योंकि 16 बिट ऐप्स के लिए हार्डवेयर समर्थन है।


-1। 16 बिट्स मोड उर्फ ​​16 बिट्स खंड को संबोधित करते हुए स्थानीय डिस्क्रिप्टर तालिका के माध्यम से समर्थित है। । वास्तव में लिनक्स पर winedvm बस यही करता है! यहां तक ​​कि एक अनौपचारिक प्रतिस्थापन भी है जिसे ओटीवीएम कहा जाता है ।
user2284570

खैर, मेरी समझ के अनुसार इसमें (वाइन समाधान) एक सीपीयू एमुलेटर है। इसलिए यह वर्चुअल 8086 मोड का उपयोग नहीं कर रहा है। यह ठीक समाधान है, जो संभवतः, पूरे पीसी का अनुकरण किए बिना, NTVDM में कार्यान्वित किया जा सकता है, जैसे DOSBOX (Win16 के साथ) करता है। और अगर आप कहते हैं कि लंबी मोड के तहत 16 बिट संरक्षित मोड का समर्थन किया जाता है, तो Win16 वास्तविक-मोड एप्लिकेशन के बारे में क्या है?
माइकल जूल

इसमें एक एमुलेटर होता है, लेकिन अगर विंडोज पर स्थानीय डिस्क्रिप्टर तालिका को संशोधित करने का एक तरीका पाया जाता है, तो कोई ulation एमुलेशन की आवश्यकता नहीं होगी। वास्तविक मोड के बारे में उन्हें इस तरह से भी अनुकरण किया जा सकता है, जैसा कि डोसेमू (लिनक्स संस्करण कम से कम) द्वारा किया गया है। Ntvdm को शुरुआत में Mips या PowerPc जैसे प्लेटफार्मों पर Dos प्रोग्राम चलाने की अनुमति देने के लिए डिज़ाइन किया गया था, जो Windows के पिछले संस्करण में समर्थित था। यह सिर्फ एक वैकल्पिक सुविधा है जिसे संकलन समय पर सक्षम करने की आवश्यकता है। और ऐसा प्रतीत होता है कि स्रोत कोड किसी को ऐसा करने की अनुमति देकर लीक किया गया था: columbia.edu/~em36/ntvdmx64.html
user2284570

3

डॉस अनुप्रयोगों और 16 बिट विंडोज़ अनुप्रयोगों के लिए स्थिति अलग है।

डॉस अनुप्रयोगों के लिए समस्या यह है कि वर्चुअल 8086 मोड लंबे मोड के तहत उपलब्ध नहीं है। यह एक सीपीयू वास्तुकला सीमा है।

16 बिट विंडोज के लिए (जो 16 बिट संरक्षित मोड में चलता है) कारण यह है कि एमएस एक उपयुक्त संगतता परत को लागू करने के लिए काम करने के लिए तैयार नहीं था। एम्यूज़ली वाइन 64-बिट लिनेक्स पर 16 बिट विंडोज़ ऐप चलाने में पूरी तरह सक्षम है।


1
यह सिर्फ इसलिए है क्योंकि 64-बिट विंडोज में कोई NTVDM नहीं है। CPU अभी भी संगतता मोड में 16-बिट कोड चला सकता है। इंटेल मैनुअल से: "संगतता मोड (IA-32e मोड का उप-मोड) - संगतता मोड 64-बिट ऑपरेटिंग सिस्टम के तहत पुन: संकलन के बिना चलने के लिए अधिकांश विरासत 16-बिट और 32-बिट अनुप्रयोगों की अनुमति देता है"
फ़्यूक्लेव

जैसा कि मैं समझता हूं कि यह संगतता मोड 16 बिट संरक्षित मोड की अनुमति देता है, लेकिन वर्चुअल 8086 मोड नहीं।
प्लगवॉश करें

2

मुझे लगता है कि सबसे संभावित कारण यह है कि पीसी मालिकों का केवल एक छोटा प्रतिशत वास्तव में अपने नए 64 बिट हार्डवेयर पर पुराने 16 बिट अनुप्रयोगों को चलाने में सक्षम होना चाहता है। Microsoft ने संभवतः यह अनुमान लगाया कि 16 बिट अनुप्रयोगों का समर्थन करते समय यह उनके लायक नहीं था।


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

मैं सोच रहा था कि "हम एक जटिल कोड आधार को बनाए नहीं रखना चाहते हैं"। यदि वे 16-बिट में रखे जाते हैं, तो उन्हें सॉफ़्टवेयर का समर्थन करना पड़ सकता है जो कि 80 के दशक में वापस आता है। इसमें बदसूरत हैक्स लगाना शामिल हो सकता है ताकि लोटस 1-2-3 अभी भी काम करे।
जो प्लांटे

@Earlz हाँ, लेकिन मुझे लगता है कि 16 बिट्स के लिए स्थानीय डिस्क्रिप्टर तालिका तक पहुंचने के लिए वास्तविक समाधान के रूप में यह वास्तविक उत्तर है, इसे सीधे करना है न कि Vm86 मोड के माध्यम से। Microsoft बस अपने कोड को पोर्ट करने से परेशान नहीं था। वास्तव में देशी 64। बिट विंडोज के लिए डिज़ाइन किया गया एक Nt in अनौपचारिक सॉफ्टवेयर प्रतिस्थापन है
user2284570
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.