Подтвердить что ты не робот

Почему исполняемая программа для конкретного процессора не работает в Linux и Windows?

Исполняемая проблема, такая как exe, не работает на Linux (без вина). При компиляции компилятора исходного кода создается объектный код, специфичный для конкретной архитектуры процессора. Но одно приложение не работает с другой ОС с одним и тем же ЦП. Я знаю, что код может включать в себя инструкции, специфичные для ОС, которые предотвращают запуск исполняемого файла. Но как насчет простой программы 2 + 2? Запутанная часть - это черт, что машинный код мешает работе. Код машины, специфичный для процессора? Если мы удалим исполняемый формат файла, мы можем увидеть тот же машинный код (например, 2 + 2) для обеих операционных систем?

Еще один вопрос: а как насчет ассемблера? DO и Linux используют разные языки ассемблера для одного и того же процессора.

4b9b3361

Ответ 1

Есть много различий. Среди них:

  • Исполняемый формат. Каждая ОС требует, чтобы двоичные файлы соответствовали определенному двоичному формату. Для Windows это формат Portable Executable (PE). Для Linux это ELF в большинстве случаев (он поддерживает и другие типы).

  • Бинарный интерфейс приложения. Каждая ОС определяет набор основных системных функций и способ их вызова. Это принципиально отличается между Linux и Windows. Хотя инструкции, которые вычисляют 2 + 2, идентичны в Linux и Windows в архитектуре x86, как запускается приложение, как он выводит вывод и как он выходит, отличается между операционными системами.

Да, обе программы Linux и Windows на архитектуре x86 используют набор команд, поддерживаемый процессором, который определен Intel.

Ответ 2

Это связано с различием загрузки программы в память и заданных ресурсов для запуска. Даже простейшие программы должны иметь кодовое пространство, пространство данных и возможность приобретать память во время работы и делать I/O. Инфраструктура для выполнения этих низкоуровневых задач совершенно разная между платформами, если у вас нет какого-либо адаптационного уровня, такого как WINE или Cygwin.

Предполагая, однако, что вы можете просто ввести произвольные собранные инструкции CPU в сегмент кода выполняющегося процесса и получить этот код для выполнения, тогда да, тот же код будет работать на обеих платформах. Тем не менее, это было бы довольно ограничено, и выполнение сложных вещей, таких как даже переходы на внешние модули, не получилось бы из-за того, как эти вещи выполняются по-разному на разных платформах.

Ответ 3

Проблема 1 - это формат изображения. Когда приложение запускается в исполнение, Os должен загрузить образ applicaiton, узнать его точку входа и запустить его оттуда. Это означает, что ОС должна понимать формат изображения, и между различными ОС существуют разные форматы.

Проблема 2 - доступ к устройствам. После запуска приложение может читать и записывать реестры в ЦП и об этом. Чтобы сделать что-нибудь интересное, например, для отображения символа на консоли, ему нужен доступ к устройствам, а это значит, что он должен запросить такой доступ из ОС. У каждой ОС есть другой API, который предлагается для доступа к таким устройствам.

Задача 3 - это инструкции. Для вновь запущенного процесса, возможно, потребуется место памяти для хранения чего-то, не может выполнить все с помощью реестров. Это означает, что ему необходимо выделить ОЗУ и настроить перевод с VA на физический адрес. Это привилегии, которые могут выполнять только ОС, и API API для доступа к этим службам различается между ОС.

Нижняя строка заключается в том, что приложения не записываются для CPU, а для набора примитивных сервисов, предлагаемых ОС. альтернативой является создание приложений против набора примитивных сервисов, предлагаемых виртуальной машиной, и это приводит к более или менее переносимым приложениям, например приложениям Java.

Ответ 4

Да, но код всегда вызывает функции библиотеки, чтобы делать что угодно - например, печать "4" на терминал. И эти библиотеки зависят от платформы и отличаются между Linux и Windows. Вот почему он не переносимый - не проблема на уровне инструкций.

Ответ 5

Вот некоторые из причин, которые я могу придумать с головы:

Ответ 6

К второму вопросу: Windows работает только на x86, x64 и IA64 (не уверен в мобильных версиях). Для Linux см. здесь.