Cosa impedisce effettivamente a Linux di aprire i file .exe?
Assolutamente nulla impedisce a Linux di aprire i file .exe. Ho appena aperto notepad.exe ed è pieno di caratteri confusi con qualche stringa leggibile qua e là.
Non si possono semplicemente eseguire i file .exe per (almeno) due ragioni:
- I file exe hanno un formato diverso da quello usato da Linux. Linux si aspetta che gli eseguibili siano in formato ELF (vedi Executable and Linkable Format - Wikipedia), mentre Windows usa il formato PE (vedi Portable Executable - Wikipedia). Il pezzo del sistema operativo che si occupa di capire il formato eseguibile delle applicazioni e delle librerie è chiamato loader. Si può facilmente preparare un caricatore di file PE per il kernel Linux (EDIT: è solo un modulo del kernel nella directory /lib/modules), ma c'è una seconda, più importante differenza:
- Il kernel Linux fornisce servizi diversi per le applicazioni rispetto al kernel Windows. Questo strato è chiamato syscall (abbreviazione di System Call), indipendentemente dalla sua forma fisica - che potrebbe essere un'effettiva istruzione assembly syscall, come in Linux su architettura AMD64 - o la sua controparte locale come swi su ARM e svc su ARM64, una chiamata a un interrupt come in Linux su architettura i386 e nei vecchi Windows, una chiamata alla funzione ntdll!KiFastSystemCall, che è un wrapper intorno all'istruzione sysenter del processore nel moderno Windows. Essenzialmente è un insieme di funzioni che permettono alle applicazioni utente di interagire con il sistema operativo: aprire file, leggere dati, avviare un nuovo processo, disegnare qualcosa sullo schermo, e così via. Un insieme di regole - come vengono chiamate queste funzioni, quali sono i loro nomi, quali sono i parametri, cosa restituiscono e così via - è chiamato ABI (Application binary interface - Wikipedia). Quindi, Windows e Linux hanno diverse ABI.
Al momento ci sono almeno 3 "traduttori" sul mercato che permettono l'esecuzione diretta cross-ABI (quindi non richiedono la presenza del sistema operativo di destinazione, in contrasto con le macchine virtuali):
- Traduttore Linux per FreeBSD. Mentre il formato degli eseguibili è lo stesso (entrambi i sistemi usano il formato ELF), hanno ABI (leggermente) diverse. L'emulatore prende l'applicazione Linux e al volo traduce le chiamate ABI di Linux in chiamate ABI di FreeBSD, le inoltra al kernel di FreeBSD e traduce le risposte di nuovo in ABI di Linux. Questo è un emulatore molto sottile, dato che l'ABI di Linux e FreeBSD sono molto simili perché entrambi sono POSIXy. Alcuni documenti sono qui: configurare la compatibilità binaria di Linux® e qui: FreeBSD - Wikipedia.
- Windows translator for Linux/FreeBSD (WINE, abbreviazione di WINE non è un emulatore, vedi Wine (software) - Wikipedia). È un caricatore e traduttore combinato. Prende un eseguibile PE di Windows, lo carica in memoria e poi al volo traduce ed emula la chiamata ABI di Windows usando le funzionalità di Linux disponibili.
- Linux translator for Windows (WSL, abbreviazione di Windows Subsystem for Linux, vedi Windows Subsystem for Linux - Wikipedia) è WINE al contrario. È anche un caricatore e traduttore combinato, ma questa volta prende l'eseguibile ELF di Linux, lo carica in memoria e poi al volo traduce ed emula l'ABI di Linux usando le funzionalità di Windows disponibili.
Articoli simili
- Ogni volta che apro un qualsiasi file .exe su Windows 7, appare un errore che dice 'Windows non riesce a trovare D:\System volume information.exe?
- Come aprire i file che dicono che non c'è un'applicazione per aprire il file
- Come aprire e leggere file eseguibili da un file .so in Linux
- Che software posso usare per aprire i file .exe come archivi?