O que está realmente impedindo o Linux de abrir arquivos .exe?
Absolutamente nada impede o Linux de abrir arquivos .exe. Eu acabei de abrir o notepad.exe e ele está cheio de caracteres falsificados com algumas cadeias de caracteres legíveis aqui e ali.
Você simplesmente não pode executar arquivos .exe por (pelo menos) duas razões:
- arquivosEXE têm formato de arquivo diferente de um usado pelo Linux. O Linux espera que os executáveis estejam no formato ELF (veja Executable and Linkable Format - Wikipedia), enquanto o Windows usa o formato PE (veja Portable Executable - Wikipedia). O pedaço de SO que lida com a compreensão do formato executável de aplicações e bibliotecas é chamado de loader. Você pode facilmente preparar um carregador de arquivos PE para o kernel Linux (EDIT: é apenas um módulo do kernel no diretório /lib/modules), mas vem em segundo lugar, a diferença mais importante:
- Linux kernel fornece serviços diferentes para aplicações do que o kernel do Windows. Esta camada é chamada syscall (abreviação de System Call), irrelevante de sua forma física - que pode ser uma instrução de montagem syscall real, como no Linux na arquitetura AMD64 - ou sua contraparte local como swi no ARM e svc no ARM64, uma chamada para uma interrupção como no Linux na arquitetura i386 e no Windows antigo, uma chamada para a função ntdll!KiFastSystemCall, que é um wrapper em torno da instrução do processador sysenter no Windows moderno. É essencialmente um conjunto de funções que permitem às aplicações do utilizador interagir com o SO: abrir ficheiros, ler dados, iniciar um novo processo, desenhar algo na tela, e assim por diante. Um conjunto de regras - como são chamadas essas funções, quais são os seus nomes, quais são os parâmetros, o que eles retornam e assim por diante - é chamado ABI (Application binary interface - Wikipedia). Assim, Windows e Linux têm diferentes ABI.
Currentemente existem pelo menos 3 "tradutores" no mercado que permitem a execução direta cross-ABI (não requerendo, portanto, a presença do SO de destino, ao contrário das máquinas virtuais):
>ul>Linux tradutor para FreeBSD. Embora o formato executável seja o mesmo (ambos os sistemas usam o formato ELF), eles têm ABI (ligeiramente) diferente. O emulador pega a aplicação Linux e traduz as chamadas ABI do Linux para as chamadas ABI do FreeBSD, encaminha-as para o kernel do FreeBSD e traduz as respostas de volta para a ABI do Linux. Este é um emulador muito fino, já que ABI do Linux e FreeBSD são muito semelhantes devido a ambos serem POSIXy. Alguns documentos estão aqui: configurando a Compatibilidade Binária Linux® e aqui: FreeBSD - Wikipedia.>li>Windows tradutor para Linux/FreeBSD (WINE, abreviação de WINE não é um emulador, veja Wine (software) - Wikipedia). É um carregador e tradutor combinado. Ele pega um executável Windows PE, carrega-o na memória e depois traduz e emula a chamada ABI para Windows usando a funcionalidade Linux disponível.li>Linux translator for Windows (WSL, abreviação de Windows Subsystem for Linux, veja Windows Subsystem for Linux - Wikipedia) é WINE ao contrário. Ele também é um carregador e tradutor combinado, mas desta vez ele leva o executável Linux ELF, carrega-o na memória e depois traduz e emula o Linux ABI usando a funcionalidade Windows disponível.