Yürütülebilir dosyalar neden işletim sistemine bağlıdır, ancak CPU'ya bağlı değildir?


16

Bir C programı yazıp bir dosyaya derlersem .exe, .exedosya CPU'ya ham makine talimatları içerir. (Bence).

Öyleyse, derlenmiş dosyayı Windows'un modern bir sürümünü çalıştıran herhangi bir bilgisayarda çalıştırmak nasıl mümkün olabilir? Her CPU ailesinin farklı bir talimat seti vardır. Peki, uygun işletim sistemini çalıştıran herhangi bir bilgisayar, .exefiziksel CPU'sundan bağımsız olarak dosyamdaki talimatları anlayabilir mi?

Ayrıca, genellikle bazı uygulamaların "indir" sayfasındaki web sitelerinde, Windows, Linux ve Mac için (genellikle her işletim sistemi için 86 ve 64 bit bilgisayarlar için iki indirme) bir indirme işlemine sahip olursunuz. Her bir CPU ailesi için neden daha fazla indirme yok?


4
CPU'lar x86, 64b vb. Standartlara sahiptir. Yürütülebilir dosyalar CPU'ya bağlıdır. Bahsettiğiniz exe'nizi RISC gibi özel bir CPU'da çalıştıramazsınız, özel amaçlı CPU'nun da bolluğu vardır
InformedA

İşletim sistemleri yürütülebilir dosyalardan oluşur ve işletim sistemi oldukları için işletim sistemlerine değil, CPU'ya bağlıdır.
Tulains Córdova

Geriye dönük uyumluluk nedeniyle.
MiKL

2
86 ve 64 bit bilgisayarlar için genellikle her işletim sistemi için iki indirme : Bunu CPU'larda yürütülebilir dosyaların bağımlılığı olarak yorumluyorum.
mouviciel

Yanıtlar:


37

Yürütülebilir dosyalar hem işletim sistemine hem de CPU'ya bağlıdır:

  • Komut Kümesi: Yürütülebilir dosyadaki ikili yönergelerin bazı yönerge kümelerine göre CPU tarafından kodu çözülür. Çoğu tüketici işlemcisi x86 (“32bit”) ve / veya AMD64 (“64bit”) komut setlerini destekler. Bir program bu komut kümelerinden herhangi biri için derlenebilir, ancak her ikisi için de derlenemez. Bu komut setlerinin uzantıları vardır; bunlar için destek çalışma zamanında sorgulanabilir. Bu tür uzantılar, örneğin SIMD desteği sunar. Derleyicileri optimize etmek, varsa bu uzantılardan yararlanmaya çalışabilir, ancak genellikle herhangi bir uzantı olmadan çalışan bir kod yolu da sunar.

  • İkili Biçim: Yürütülebilir dosya, işletim sisteminin programı doğru bir şekilde yüklemesine, başlatmasına ve başlatmasına izin veren belirli bir ikili biçime uymalıdır. Windows esas olarak Taşınabilir Yürütülebilir formatı kullanırken Linux ELF kullanır.

  • Sistem API'leri: Program, yürütme sisteminde bulunması gereken kütüphaneleri kullanıyor olabilir. Bir program Windows API'larındaki işlevleri kullanıyorsa, Linux'ta çalıştırılamaz. Unix dünyasında, merkezi işletim sistemi API'leri POSIX olarak standartlaştırılmıştır: yalnızca POSIX işlevlerini kullanan bir program Mac OS X ve Solaris gibi herhangi bir uyumlu Unix sisteminde çalışabilir.

Dolayısıyla, iki sistem aynı sistem API'lerini ve kitaplıklarını sunuyorsa, aynı komut kümesinde çalışır ve aynı ikili biçimi kullanırsa, bir sistem için derlenmiş bir program diğerinde de çalışır.

Bununla birlikte, daha fazla uyumluluk elde etmenin yolları vardır:

  • AMD64 yönerge kümesinde çalışan sistemler genellikle x86 yürütülebilir dosyalarını da çalıştırır. İkili biçim, hangi modun çalıştırılacağını gösterir. Hem 32bit hem de 64bit programlarını işlemek için işletim sisteminin ek çaba göstermesi gerekir.

  • Bazı ikili biçimler, bir dosyanın farklı komut kümeleri için derlenen bir programın birden çok sürümünü içermesine izin verir. Bu tür “şişman ikili dosyalar” Apple tarafından PowerPC mimarisinden x86'ya geçerken teşvik edildi.

  • Bazı programlar makine koduna değil, bazı ara gösterimlere derlenir. Bu, daha sonra anında gerçek talimatlara çevrilir veya yorumlanabilir. Bu, bir programı belirli mimariden bağımsız hale getirir. Böyle bir strateji UCSD p-Sisteminde kullanıldı.

  • Bir işletim sistemi birden çok ikili formatı destekleyebilir. Windows oldukça geriye dönük uyumludur ve hala DOS döneminden formatları desteklemektedir. Linux'ta Wine, Windows formatlarının yüklenmesine izin verir.

  • Bir işletim sisteminin API'leri başka bir ana bilgisayar işletim sistemi için yeniden uygulanabilir. Windows'da Cygwin ve POSIX alt sistemi (çoğunlukla) POSIX uyumlu bir ortam elde etmek için kullanılabilir. Linux'ta Wine, Windows API'larının çoğunu yeniden uygular.

  • Platformlar arası kütüphaneler, bir programın işletim sistemi API'larından bağımsız olmasını sağlar. Birçok programlama dili, bunu başarmaya çalışan standart kütüphanelere sahiptir, örneğin Java ve C.

  • Bir emülatör , yabancı ikili biçimi ayrıştırarak, talimatları yorumlayarak ve gerekli tüm API'ların yeniden uygulanmasını sunarak farklı bir sistemi simüle eder. Emülatörler genellikle eski bir Nitendo oyunlarını modern bir bilgisayarda çalıştırmak için kullanılır.


10
Hem java hem de .net'in bir ara format kullanma örnekleri olduğunu belirtmelisiniz - ara formatlar bugün çok popülerdir ve sadece 5 1/4 disketten oluşan bir 1970'in sisteminin kalıntısı değil.
jmoreno

@AKoscianski önerdiğiniz düzenleme için teşekkür ederiz . Ancak, güvenlik tasarımının yürütülebilir dosyaların işletim sistemine bağımlı olmasının nedeni olmadığını, ancak işletim sistemi ile kullanıcı arazisinin ilk etapta bölünmesinin nedenini düşünüyorum. Bu tür korumalı işletim sistemi işlevlerine yönelik farklı API'ler zaten bu cevabın “Sistem API'ları” bölümü tarafından ele alınmıştır.
amon

2

Windows çalıştıran mevcut bilgisayarların% 99'unda 32 bit yazılım da çalıştırabilen 64 bit işlemci bulunur. Diğer yüzde birinde 32 bit işlemci var. 32 bit işlemciler için geliştirilen yazılım her yerde çalışır. 64 bit işlemciler için oluşturulan yazılım, yazılımın yaratıcısının önem verdiği her bilgisayarda çalışır.

MacOS X ve iOS "yağ ikili dosyaları" nı destekler - indirdiğiniz şey aslında farklı işlemciler için sürümler içerebilir. Artık kimse PowerPC işlemcileri için uygulama geliştirmiyor, ancak birkaç yıl önce bir yürütülebilir dosya bir PowerPC, 32 bit Intel ve 64 bit Intel sürümü içerebilir ve doğru olanı çalıştırılabilir. Bugünlerde iOS'ta, bir uygulama indirdiğinizde, cihazınızdaki işlemciye uygun bir sürüm alacaksınız. Farklı bir cihaza indirin ve farklı bir sürüm elde edin. Tamamen kullanıcı tarafından görülmez.


-1

Bir exe sadece ham makine kodundan daha fazla bilgi içerir. İşletim sistemi bunu yüklerken okur ve nasıl çalışması gerektiğini bulabilir.

Derlediğinizde, genellikle bir hedef CPU ayarlamış olursanız, derleyici mevcut CPU'nuzu seçer ve yalnızca CPU'nuz ve eski sürümleri için ortak olan talimatları seçerek kendisini kısıtlar. Hedef CPU'nuzun belirli bir revizyonuna özgü yeni ve süslü bir talimat kullanmak istiyorsanız, derleyiciye söyleyebilir veya kendinden veya satır içi montaj koduyla manuel olarak kodlayabilirsiniz. Ancak, bu talimatı desteklemeyen bir CPU'da çalıştırılırsa programınız çökecektir.

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.