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

12

Se scrivo un programma C e lo compilo in un file .exe , il file .exe contiene le istruzioni raw della macchina per la CPU. (Penso).

In caso affermativo, come è possibile che eseguo 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ò comprendere le istruzioni nel mio file .exe , indipendentemente dalla CPU fisica?

Inoltre, spesso nei siti web nella pagina "download" di alcune applicazioni, si dispone di 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 più download, per ogni famiglia di CPU?

    
posta Aviv Cohn 26.07.2014 - 12:32
fonte

3 risposte

31

I file eseguibili dipendono sia dal sistema operativo che dalla CPU:

  • Set di istruzioni: le istruzioni binarie nell'eseguibile vengono decodificate dalla CPU in base ad alcune 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 entrambi. Ci sono estensioni a questi set di istruzioni; il supporto per questi può essere interrogato 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 in genere offre anche un percorso di codice che funziona senza estensioni.

  • 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 usa ELF.

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

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

Tuttavia, ci sono modi per ottenere più compatibilità:

  • I sistemi in esecuzione sul set di istruzioni AMD64 eseguiranno anche eseguibili x86. Il formato binario indica quale modalità eseguire. La gestione di entrambi i programmi a 32 bit 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, compilato per diversi set di istruzioni. Tali "binari grassi" sono stati incoraggiati da Apple mentre passavano dall'architettura PowerPC a x86.

  • Alcuni programmi non sono compilati per codice macchina, ma per alcune rappresentazioni intermedie. Questo viene quindi tradotto al volo in base alle istruzioni effettive o potrebbe essere interpretato. Ciò rende un programma indipendente dall'architettura specifica. Tale strategia è stata utilizzata su UCSD p-System.

  • Un sistema operativo può supportare più formati binari. Windows è abbastanza compatibile con le versioni precedenti e supporta ancora i formati dell'era DOS. Su Linux, Wine consente di caricare i formati di 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 (soprattutto) 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 dispongono di librerie standard che cercano di raggiungere questo obiettivo, ad es. Java e C.

  • Un emulatore simula un sistema diverso analizzando il formato binario straniero, 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.

risposta data 26.07.2014 - 13:32
fonte
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 per cento ha processori a 32 bit. Quindi il software costruito per processori a 32 bit funziona ovunque. Il software sviluppato per processori a 64 bit viene eseguito su tutti i PC a cui si rivolge il creatore del software.

MacOS X e iOS supportano "file binari grassi": ciò che scarichi può contenere versioni per processori diversi. Nessuno costruisce più le applicazioni per i processori PowerPC, ma a un certo punto qualche anno fa un eseguibile poteva contenere un PowerPC, un Intel a 32 bit e una versione Intel a 64 bit, e quello giusto sarebbe stato eseguito. Oggi su iOS, quando scarichi un'app, otterrai una versione adatta al processore sul tuo dispositivo. Scarica su un altro dispositivo e ottieni una versione diversa. Totalmente invisibile all'utente.

    
risposta data 09.01.2017 - 20:53
fonte
-1

Un exe contiene più informazioni del semplice codice macchina grezzo. Il sistema operativo legge questo quando lo carica e può capire come dovrebbe funzionare.

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

    
risposta data 26.07.2014 - 13:27
fonte

Leggi altre domande sui tag