Совершенно ничто не мешает Linux открывать файлы с расширением .exe
Вы просто не можете просто запускать файлы по (как минимум) двум причинам:
- Файлы EXE имеют формат , отличный от того, который используется в Linux. Linux ожидает, что исполняемые файлы будут в формате ELF (см. Исполняемые и связываемые форматы - Википедия), в то время как Windows использует формат PE (см. Portable Executable - Wikipedia). Часть ОС, которая занимается пониманием исполняемого формата приложений и библиотек, называется загрузчиком . Вы можете легко подготовить загрузчик PE-файлов для ядра Linux ( EDIT: это просто модуль ядра в /lib/modulesкаталоге), но есть второе, более важное отличие:
- Ядро Linux предоставляет различные службы для приложений, чем ядро Windows. Этот уровень называется системным вызовом (за исключением системного вызова ), независимо от его физической формы - которая может быть фактической syscall инструкцией сборки, как в Linux на архитектуре AMD64 - или ее локальным аналогом, как swi на ARM и svc на ARM64, вызов прерывания как в Linux на архитектуре i386 и более старых версиях Windows - функция callto ntdll!KiFastSystemCall, которая является оболочкой для процессора sysenter инструкция в современной винде. По сути, это набор функций, позволяющих пользовательским приложениям взаимодействовать с ОС: открывать файл, читать данные, запускать новый процесс, рисовать что-то на экране и так далее. Набор правил - как называются эти функции, каковы их имена, каковы параметры, что они возвращают и т. Д. - называется ABI ( двоичный интерфейс приложения - Википедия).). Таким образом, Windows и Linux имеют разные ABI .
В настоящее время на рынке существует как минимум 3 «транслятора», которые позволяют выполнять прямое кросс-ABI (таким образом, не требуя наличия целевой ОС, в отличие от виртуальных машин):
- Linux переводчик для FreeBSD. Хотя исполняемый формат один и тот же (обе системы используют формат ELF), у них (немного) разный ABI. Эмулятор берет Linux-приложение и "на лету" переводит вызовы Linux ABI во FreeBSD ABI, пересылает их на ядро FreeBSD и переводит ответы обратно в Linux ABI. Это очень тонкий эмулятор, так как ABI Linux и FreeBSD очень похожи, так как оба являются POSIXy.
- Windows переводчик для Linux/FreeBSD (WINE, сокращение от WINE не эмулятор). Это комбинированный загрузчик и переводчик. Он берет исполняемый файл Windows PE, загружает его в память, а затем "на лету" транслирует и эмулирует вызов Windows ABI, используя доступную функциональность Linux.
- Переводчик Linux для Windows (WSL, сокращение от Windows Subsystem for Linux) - это WINE в обратном направлении. Это также комбинированный загрузчик и переводчик, но на этот раз он берет Linux ELF исполняемый файл, загружает его в память, а затем "на лету" транслирует и эмулирует Linux ABI, используя доступную функциональность Windows.