QNA > C > Cosa Impedisce Effettivamente A Linux Di Aprire I File .Exe?

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:

  1. 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:
  2. 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.

Di Willmert

Dal momento in cui si apre un file eseguibile, al momento in cui si finisce, come funziona un'installazione? :: Quali sono alcuni fatti sconvolgenti sui dispositivi Google Nexus?
Link utili