Perché gli eseguibili dipendono dal sistema operativo ma non dalla CPU?


16

Se scrivo un programma C e lo compilo in un .exefile, il .exefile contiene istruzioni sulla macchina non elaborate per la CPU. (Penso).

In tal caso, come è possibile eseguire il file compilato su qualsiasi computer che esegue una versione moderna di Windows? Ogni famiglia di CPU ha un set di istruzioni diverso. Quindi, come mai un computer che esegue il sistema operativo appropriato può capire le istruzioni nel mio .exefile, indipendentemente dalla sua CPU fisica?

Inoltre, spesso nei siti Web nella pagina "download" di alcune applicazioni, è disponibile un download per Windows, per Linux e per Mac (spesso due download per ciascun sistema operativo, per computer a 86 e 64 bit). Perché non ci sono molti altri download, per ogni famiglia di CPU?


4
Le CPU hanno standard come x86, 64b, ecc. Gli eseguibili dipendono dalla CPU. Non puoi far funzionare il tuo exe di cui hai parlato su una CPU speciale come RISC, ci sono anche molte CPU per scopi speciali
Informata il

I sistemi operativi sono costituiti da eseguibili e dipendono dalla CPU, non dai sistemi operativi, poiché sono il sistema operativo.
Tulains Córdova,

A causa della retrocompatibilità.
MiKL

2
spesso due download per ciascun sistema operativo, per computer a 86 e 64 bit : lo interpreto come una dipendenza degli eseguibili dalle CPU.
mouviciel,

Risposte:


37

Gli eseguibili dipendono sia dal sistema operativo che dalla CPU:

  • Set di istruzioni: le istruzioni binarie nell'eseguibile sono decodificate dalla CPU in base ad alcuni set di istruzioni. La maggior parte delle CPU consumer supporta i set di istruzioni x86 ("32 bit") e / o AMD64 ("64 bit"). Un programma può essere compilato per uno di questi set di istruzioni, ma non per entrambi. Esistono estensioni a questi set di istruzioni; il supporto per questi può essere richiesto in fase di esecuzione. Tali estensioni offrono supporto SIMD, ad esempio. L'ottimizzazione dei compilatori potrebbe provare a sfruttare queste estensioni se sono presenti, ma di solito offrono anche un percorso di codice che funziona senza alcuna estensione.

  • Formato binario: l'eseguibile deve essere conforme a un determinato formato binario, che consente al sistema operativo di caricare, inizializzare e avviare correttamente il programma. Windows utilizza principalmente il formato Portable Executable, mentre Linux utilizza ELF.

  • API di sistema: il programma potrebbe utilizzare librerie, che devono essere presenti sul sistema in esecuzione. Se un programma utilizza funzioni delle API di Windows, non può essere eseguito su Linux. Nel mondo Unix, le API del sistema operativo centrale sono state standardizzate su POSIX: un programma che utilizza solo le funzioni POSIX sarà in grado di funzionare su qualsiasi sistema Unix conforme, come Mac OS X e Solaris.

Pertanto, se due sistemi offrono le stesse API e librerie di sistema, vengono eseguiti sullo stesso set di istruzioni e utilizzano lo stesso formato binario, un programma compilato per un sistema verrà eseguito anche sull'altro.

Tuttavia, ci sono modi per ottenere una maggiore compatibilità:

  • I sistemi in esecuzione sul set di istruzioni AMD64 eseguiranno comunemente anche eseguibili x86. Il formato binario indica quale modalità eseguire. La gestione di programmi a 32 e 64 bit richiede uno sforzo aggiuntivo da parte del sistema operativo.

  • Alcuni formati binari consentono a un file di contenere più versioni di un programma, compilate per diversi set di istruzioni. Tali "fat binaries" sono stati incoraggiati da Apple mentre passavano dall'architettura PowerPC a x86.

  • Alcuni programmi non sono compilati in codice macchina, ma in una rappresentazione intermedia. Questo viene quindi tradotto al volo in istruzioni reali o potrebbe essere interpretato. Ciò rende un programma indipendente dall'architettura specifica. Tale strategia è stata utilizzata sul sistema p UCSD.

  • Un sistema operativo può supportare più formati binari. Windows è abbastanza retrocompatibile e supporta ancora formati dell'era DOS. Su Linux, Wine consente il caricamento dei formati Windows.

  • Le API di un sistema operativo possono essere reimplementate per un altro sistema operativo host. Su Windows, Cygwin e il sottosistema POSIX possono essere utilizzati per ottenere un ambiente (principalmente) conforme a POSIX. Su Linux, Wine reimplementa molte delle API di Windows.

  • Le librerie multipiattaforma consentono a un programma di essere indipendente dalle API del sistema operativo. Molti linguaggi di programmazione hanno librerie standard che cercano di raggiungere questo obiettivo, ad esempio Java e C.

  • Un emulatore simula un sistema diverso analizzando il formato binario esterno, interpretando le istruzioni e offrendo una reimplementazione di tutte le API richieste. Gli emulatori sono comunemente usati per eseguire vecchi giochi Nitendo su un PC moderno.


10
Dovresti menzionare che sia java che .net sono esempi di utilizzo di un formato intermedio: i formati intermedi sono molto popolari oggi e non solo una reliquia di un sistema degli anni '70 che funzionava con 5 1/4 floppy.
jmoreno,

@AKoscianski grazie per la modifica suggerita . Tuttavia, penso che il design della sicurezza non sia il motivo per cui gli eseguibili dipendono dal sistema operativo, ma il motivo per cui abbiamo in primo luogo diviso il sistema operativo rispetto all'utente. Le diverse API di tale funzionalità del sistema operativo protetto erano già state affrontate dalla sezione "API di sistema" di questa risposta.
amon,

2

Il 99% degli attuali PC con Windows ha un processore a 64 bit, che è anche in grado di eseguire software a 32 bit. L'altro uno percento ha processori a 32 bit. Quindi il software creato per processori a 32 bit funziona ovunque. Il software creato per i processori a 64 bit funziona su tutti i PC di cui si occupa il creatore del software.

MacOS X e iOS supportano "fat binaries": ciò che scarichi in realtà può contenere versioni per processori diversi. Nessuno costruisce più applicazioni per processori PowerPC, ma a un certo punto qualche anno fa un eseguibile poteva contenere un PowerPC, una Intel a 32 bit e una versione Intel a 64 bit, e quella giusta sarebbe stata eseguita. Al giorno d'oggi su iOS, quando scarichi un'app, otterrai una versione adatta al processore sul tuo dispositivo. Scarica su un altro dispositivo e otterrai una versione diversa. Totalmente invisibile per l'utente.


-1

Un exe contiene più informazioni del semplice codice macchina grezzo. Il sistema operativo legge questo durante il caricamento e può capire come dovrebbe essere eseguito.

Quando si compila si imposta generalmente una CPU di destinazione, in caso contrario il compilatore sceglierà la CPU corrente e si limiterà a scegliere solo le istruzioni comuni alla CPU e alle versioni precedenti di essa. Se si desidera utilizzare una nuova fantastica istruzione specifica per determinate revisioni della CPU di destinazione, è possibile dire al compilatore o codificarlo manualmente con codice intrinseco o inline assembly. Tuttavia, il programma si arresta in modo anomalo se viene eseguito su una CPU che non supporta tale istruzione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.