Почему нельзя запустить бинарник Linux в Windows, даже на одном и том же x86-процессоре?
Можно было бы свалить всё на разный формат файлов (ELF против .exe), но настоящая причина - ABI (Application Binary Interface).
ABI — это жёсткий "контракт", определяющий, как программа разговаривает с ядром. Бинарник компилируется не просто под конкретный CPU (x86), а под конкретный ABI (например, «Linux-on-x86»).
Чтобы вывести «Hello», программа не может просто напрямую писать на экран. Она должна попросить ядро сделать это.
Ниже приведён полный, самодостаточный пример того, как можно общаться с ядром. Он не использует вообще никаких библиотек, написан на ассемблере, так что можно увидеть всю цепочку взаимодействия между программой и операционной системой. Этот код рассчитан на классический x86 Linux ABI, и он до сих пор работает.
Секрет в инструкции
int $0x80.Эта инструкция генерирует программное прерывание. Это такой "звонок", которым программа говорит CPU: «Стоп! Приостанови выполнение и передай управление ОС».
Ядро Linux просыпается, видит прерывание 0x80 и понимает, что пользовательское приложение запрашивает системный вызов. Оно смотрит в регистр
%eax, видит число 4 и говорит: «Ага, это write». После чего послушно использует аргументы из %ebx, %ecx и %edx, чтобы выполнить работу.У ядра Windows совершенно другие правила. Его системный вызов "write" – это не #4, и оно вообще, скорее всего, не реагирует на
int $0x80.Ваш Linux-бинарник говорит на языке Linux-контракта. Для ядра Windows это просто шум. Оно не понимает запрос и не будет его выполнять
@linuxos_tg
