64 bit işletim sistemi neden 16 bitlik bir uygulamayı çalıştıramıyor?


38

Bu neden öyle:

  • 64 bit işlemciye yüklendiğinde 32 bit işletim sistemi olan eski 16 bit uygulamaları çalıştırabilir,
  • 64-bit işletim sistemi kurarsanız, bu uygulamaları doğrudan çalıştıramaz ve bir tür emülasyona (bu her zaman kusursuz bir şekilde çalışmaz) ihtiyaç duymaz.

Daha açık olmak gerekirse, 64 bit bir işlemcime (Intel Core 2 Duo) sahibim. Windows XP ve Windows 7 (her ikisi de 32 bit) yüklü olduğunda, eski DOS ve 616 bit Windows uygulamalarını çalıştırabilirler.

Şimdi Windows 7'nin 64-bit sürümünü yükledim. Neden artık aynı uygulamaları çalıştırmıyor?


3
Bunun konuk işletim sistemi ile daha az bit ve daha fazlası olduğunu düşünüyorum. Özel olarak hangi işletim sistemlerinden bahsediyorsunuz?
Pekka GoFundMonica'ya

DOSBox altında çalışacak mı?
Penguat

1
DOSBOX adlı bir yardımcı program var, 16 bit programınıza çalışacak sanal bir 16 bit bilgisayar sağlayan 16 bitlik bir öykünücüsü ve ücretsiz.

Ben Pekka ile, aslında 64-bit (donanım) sistemi olduğunu hemfikir olabilir (OS böylece tasarlanmış olsaydı, halt bile 1-bitlik kod) 16 bitlik kod çalıştırmasına. İşin aslı, CPU'nun farklı işaretçi boyutları gibi şeyler nedeniyle 16 bitlik kodu doğrudan çalıştıramamasıdır, ancak bu sorunlar işletim sistemi tarafından soyutlanabilir. Sınırlama, Microsoft'un işleri basitleştirmek için dayattığı yapay bir şeydir (hala 32-bit kod olduğu için hala 32-bit öykündüğü halde). Sorunsuz bir şekilde 16-bit kod çalıştırabilen başka işletim sistemleri (* nix?) Vardır.
Synetech

Windows'u tüm işletim sistemleriyle karıştırıyorsunuz.
Ken Sharp,

Yanıtlar:


24

Anladığım kadarıyla, Uzun Modda (x64 yerel) çalışırken, CPU'nun 16 bit moduna geçmesini desteklemediği için. Vikipedi'ye bakınız . Bu nedenle, 16 bit modunu desteklemek için, NTVDM (Windows'taki 16 bit katman) 16 bit işlemciyi tam olarak taklit etmek zorunda kalacaktı.

Sanırım bunu gerçekleştirmek için halihazırda mevcut sanallaştırma yazılımı (VirtualPC, VirtualBox) kullanarak bir emülasyon katmanını yeniden uygulamada tartıldılar ve VDM'nin kesilmesine karar verildi.


6
Vikipedi'den alıntı : 64-bit mimariler için Windows NT sürümleri (x64 ve IA-64) NTVDM'yi içermez ve DOS veya 16-bit Windows uygulamalarını çalıştıramazlar. Bunun nedeni, x86-64 CPU'da sanal 8086 modunun, yerel, 64 bit uzunluğunda değil, yalnızca eski modda (16 ve 32 bit işletim sistemlerini çalıştırmak için) alt mod olarak mevcut olmasıdır; eski moda geçmek için CPU'nun sert şekilde sıfırlanması gerekir. Bu yüzden NTVDM'nin şu ana kadar nasıl çalıştığı tek yol artık mevcut değil ve tam VM'ler orada fazlasıyla var, bu yüzden NTVDM kesildi.
Joey

5
Evet, V86 modunu terk ettiklerine inanamıyorum. Tamamen gerçek modu tamamen atmak ve bunu yapacaksanız 32/64 bitlik önyükleyici talep edebilirsiniz.
Brian Knoblauch

5
Bu zaten olan şey tam olarak buydu, Bay Knoblauch. EFI ürün yazılımı bulunan modern bir x86 makinesi, ilk birkaç talimatında gerçek dışı moddan 64/32-bit korumalı moda geçer. Önyükleyici gerçekten 64/32-bit korumalı mod programdır. EFI önyükleme uygulamaları budur. İşlemde hiçbir yerde gerçek mod veya v8086 korumalı mod kullanılmaz.
JdeBP,

3
-1. WINE, 64 bit Linux'ta 16 bit Windows uygulamalarının VM86 modunda çalışmasını destekler. ekran görüntüsü . V86-64 Proje sayfası . Mehrdad'ın cevabı daha zorlayıcı bir neden gibi görünüyor.
Hugh Allen,

3
@HughAllen: o sayfa şu anda "Şu anda 64 çekirdekli linux çekirdeği sürümü V86 modunu desteklemiyor, çünkü bu işlemcilerin yerel işletim modunda (uzun mod) desteklenmiyor." ve "Bu yama çok deneysel ." Kısa cevap, 16-bit kodunu çalıştırmak mümkün olsa da, tamamen uzun moddan çıkarak, bunu yapmak mantıklı değildir .
Harry Johnston,

14

Çünkü 64 bit kolları 32 önemli bit var :

64 bit Windows'un 16 bit Windows tabanlı uygulamaların çalışmasını desteklemediğini unutmayın.
Birincil neden, tutamaçların 64-bit Windows'ta 32 önemli bitinin olmasıdır.
Bu nedenle, tanıtıcılar kesilebilir ve veri kaybı olmadan 16 bit uygulamalara aktarılamaz.

Windows'ta, programlar işletim sistemine "tutamaçları" geçer ve bunun tersi (işletim sisteminin pencere gibi belirli bir kaynağı benzersiz bir şekilde tanımlamak için kullandığı numaralardır).

16 bit programları desteklemek için, 32 bit Windows yalnızca 16 önemli bit içeren bir tutamaç üretir - 16 üst bit işletim sistemi tarafından göz ardı edilir (programlar bu durumdan faydalanmasa da). Yani hiçbir program 2 16'dan fazla nesneyle etkileşime giremez, ki bu aslında oldukça düşüktür.

Bununla birlikte, bunu geliştirmek için 64-bit Windows, bir tutamaçtaki önemli bit sayısını 32'ye yükseltti. Dolayısıyla, 16 bit programlar 64 bit Windows'ta çalışamaz.


3
@Joey: Ne dediğini anlamıyorum. İşletim sistemi 64 bit Windows ise, 16 bit uygulamalar üzerinde çalışamaz. Nasıl "DOS" veya "Windows" uygulaması oldukları gerçeğinin burada bir şeyi nasıl değiştirdiğini göremiyorum - her iki durumda da tutamaçların uygulama tarafından kesilmesi gerekir.
Mehrdad

1
DOS uygulamalarında tanıtıcı yok. Aslında, onlar (genellikle) Windows üzerinde çalıştıklarını bile bilmiyorlar.
Joey,

1
... aslında, Win16 kodu bile bir sorun yaratmamalı, şimdi düşünüyorum. Tek ihtiyacınız olan bir arama masası.
Harry Johnston,

1
@HarryJohnston: Sanırım sorunu özlüyorsunuz. Bir uygulama çağırdığında hayali "arama tablonuzda" ne olacağını EnumWindowsve sistemde 2 ^ 16'dan fazla pencere bulunduğunu ne öneriyorsunuz ?
Mehrdad

1
Pencere tutamaçlarından değil, makaleye göre çekirdek tutamaçlarından bahsediyordum. Onlar tamamen farklı şeyler. 16 bit uygulamalar bile 32 bit pencereler görüyor mu? Mesaj yapıları farklı olduğu için olası görünmüyor; 16 bit uygulamasına 32 bit wParam içeren bir ileti gönderilirse ne olur? Ayrıca, azami pencere tutamağı sayısının msdn.microsoft.com/en-us/library/windows/desktop/…
Harry Johnston

10

Windows için, işletim sisteminin x86 sürümlerinin bu eski DOS işlemlerini çalıştırmalarına olanak sağlayan 16 bit öykünme içermesi nedeniyle. X64 sürümlerinde, 32 bitlik işlemlerin çalışmasına izin vermek için x86 yürütmesini taklit etmek zorundalar (WoW64 olarak adlandırıyorlar) ve sanırım 16 bit öykünücüsünü daha fazla taklit etmek için Wow64 kullanmak çok fazla soruna neden oldu.

Tanınan 16-bit işlemlerin bir kısmı çalışacaktır, çünkü öykünme bunları işlemesi zor kodlanmıştır, fakat öykünme çalışmaz çünkü öykünme x64'e dahil değildir.

MSKB makalesinde "16 bit kod yok" bölümüne bakın: http://support.microsoft.com/kb/282423


14
Devam eden bir öykünme yok - x86 / 64 bu şeyleri yerel olarak çalıştırabilir. Bununla birlikte devam eden API thunking var. Microsoft bu fırsatı, oldukça eski ve çoğunlukla kullanılmayan bir teknolojiyi kullanmak için seçti.
Chris K,

@Chris Kaminski - Bunu bir mimarlık kararı olarak - x86 - x64 - - "Tamam - Windows 7, ve artık 16 bitlik işlemler yapmıyoruz" demenin aksine yaptıklarına şaşırdım. Özellikle şimdi 7'ye gömülmüş olan "Windows XP Mode" ile, x86 sürümünde bile desteği kesmek için mükemmel bir zaman gibi görünüyor.
SqlRyan

@ Chris Kaminski: Ona biraz daha düşünce verdikten sonra, sadece bir çeşit API-mucking değil, öykünmesi gerektiğini düşünüyorum. Yerel olarak farklı bir bit derlemesinin kodunu çalıştırabilirse, neden x64 32-bit uygulamaları çalıştırmak için Wow64'e sahip olsun?
SqlRyan

@darthcoder: CPU, NTVDM tarafından uzun (64 bit) modda istenen sanal 8086 modunu desteklemiyor. Bu nedenle, NTVDM'nin her şeyi taklit eden ya da kesilen tam bir VM olması gerekir. Dışarıda yeterince VM olduğu için (ve MS'in de bir tane var) bu zor bir karar değildi. Bunun kaç yaşında olduğu ya da ne kadar kullandığı ile ilgisi olduğunu sanmıyorum.
Joey,

rwmnau: WoW64 için devam eden emülasyon yoktur (Itanium hariç). x64-64 CPU'lar hala 32-bit komutları desteklemektedir, bu nedenle neredeyse tüm Windows işlemcileri CPU'yu 32-bit modunda değiştirmek ve birkaç işaretçi ile karıştırmaktır.
Joey

3

Yanılıyorsam düzelt, ancak benim anladığım kadarıyla NTVDM'nin sanal 8086 modunu kullanması Windows'a özgü bir sorundan kaynaklanıyor. X64 işlemcilerdeki Uyumluluk modu (uzun modda çalışır), burada bulduğumdan 16 ve 32 bit uzaklıkta 'temiz' korumalı modu destekler: http://en.wikipedia.org/wiki/Long_mode , ancak Sanal 8086 modu gibi 386 ekler. Bu nedenle, büyük olasılıkla desteklenmiyor çünkü Microsoft’un NTVDM’yi yeniden programlamasına izin vermiyor, çünkü bazı 16-bit korumalı mod uygulamaları çoğu zaman olmasa bile sanal 8086 kullanabiliyor, muhtemelen daha fazla öykünme eklemek istiyor. Yeterli emekle, uzun modda çalışan dosbox'tan daha hızlı bir şeyler yazmak mümkün, çünkü 16bit uygulamalar için donanım desteği var.


-1. 16 bit modu adresli 16 bit modu, yerel tanımlayıcı tablosu aracılığıyla desteklenir. . Aslında Linux'ta winedvm tam da bunu yapıyor! Otvdm denilen resmi olmayan bir değiştirme bile var .
user2284570

Anladığım kadarıyla (şarap çözümü) bir CPU emülatörü içerir. Bu yüzden sanal 8086 modunu kullanmıyor. Bu, tam olarak, DOSBOX (Win16 ile) gibi, tüm bilgisayarı taklit etmeden NTVDM'de potansiyel olarak uygulanabilecek bir çözümdür. 16 bit korumalı modun uzun modda desteklendiğini söylerseniz, peki ya Win16 gerçek mod uygulamaları?
MichaelS,

Bir öykünücüyü içerir, ancak Windows'ta yerel tanımlayıcı tablosunu değiştirmenin bir yolu bulunursa, öykünme gerekmez. Gerçek mod hakkında da Dosemu (en azından Linux versiyonu) tarafından yapılan şekilde taklit edilebilirler. Ntvdm, Dos programının Windows'un önceki sürümünde desteklenen Mips veya PowerPc gibi platformlarda çalıştırılmasına izin vermek için tasarlanmıştı. Derleme zamanında etkinleştirilmesi gereken isteğe bağlı bir özelliktir. Ve kaynak kodunun birisinin bunu yapmasına izin
vermekle

3

Dos uygulamaları ve 16 bit pencere uygulamaları için durum farklıdır.

Dos uygulamaları için sorun sanal 8086 modunun uzun modda mevcut olmamasıdır. Bu bir CPU mimarisi sınırlamasıdır.

16 bit Windows uygulamaları (16 bit korumalı modda çalışır) nedeni, MS'in uygun bir uyumluluk katmanı oluşturmak için işi yapmaya hazır olmamasıdır. Eğlenceli bir şekilde Wine, 64-bit linux'da 16 bit windows uygulamaları çalıştırabilir.


1
sadece 64-bit Windows'ta NTVDM olmadığı için. CPU hala uyumluluk modunda 16 bit kod çalıştırabilir. Intel el kitabından: "Uyumluluk modu (IA-32e modunun alt modu) - Uyumluluk modu, eski 16 bit ve 32 bit uygulamaların 64 bit işletim sistemi altında yeniden derlenmeden çalışmasına izin verir"
phuclv

Anladığım kadarıyla uyumluluk modu 16 bit korumalı moda izin veriyor, ancak sanal 8086 moduna izin vermiyor.
plugwash

2

Bence en muhtemel sebep, PC sahiplerinin yalnızca küçük bir yüzdesinin yeni 64 bit donanımlarında eski 16 bit uygulamaları çalıştırabilmelerini istemeleri. Microsoft, muhtemelen 16 bit uygulamaları desteklemeye devam ederken değmeyeceğini düşündü.


Bu yüzden görünüşte 's değerinde onlar zaten ne var kullanmak ama x86-64 için gerekli olacaktır dolayı hiçbir sanal-8086 moduna (bunu reimplement değil, Windows 7 32bit hala yuvaları dışında mantıklı
Earlz

"Karmaşık bir kod tabanını korumak istemiyoruz" diye düşünüyordum. 16-bit'de tutulurlarsa, 80'lere dayanan yazılımı desteklemek zorunda kalabilirlerdi. Bu, Lotus 1-2-3'ün hala çalışabilmesi için çirkin saldırılara neden olabilir.
Joe Plante

@Earlz evet, ancak bunun 16 bitlik Yerel Tanımlayıcı tablosuna erişmek için gerçek çözüm olarak gerçek cevap olduğunu düşünüyorum, Vm86 modunda değil, doğrudan yapmak. Microsoft, kodlarını taşımaktan rahatsız olmadı. Aslında yerli 64 bit Windows için tasarlanmış bir resmi olmayan Nt replacement yazılım değiştirme var .
user2284570
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.