Разница между программами, скомпилированными для разных ОС

С точки зрения скомпилированного кода, в чем разница между программой, скомпилированной для одного os vs another (например, Linux vs windows). Не работает ли программа непосредственно на процессоре? Или это потому, что программа должна ссылаться на конкретные библиотеки ОС?

  • Как проверить температуру моего процессора в Windows?
  • Тестирование аппаратного обеспечения ноутбука
  • Определите, какая вкладка в Firefox использует ресурсы ЦП?
  • Каково влияние запуска процессора на 100% в течение длительного времени за раз?
  • Как определить узкое место аппаратного обеспечения в ноутбуке?
  • Почему мой компьютер не работает на полной скорости?
  • Svchost.exe, используя большую память, замедляющую мой компьютер
  • Является ли CPU активным в спящем режиме?
  • 3 Solutions collect form web for “Разница между программами, скомпилированными для разных ОС”

    Обычные скомпилированные программы «запускаются напрямую» на CPU, но программа не работает в вакууме:

    1. Многие программы полагаются на внешние, динамически загружаемые библиотеки ( DLLs или .so ). Способ связать их с компилятором / компоновщиком, и каждая ОС имеет разные стандарты. Тем не менее, существуют также «статически связанные» программы, которые предоставляют весь свой собственный код.

    2. Современная ОС не дает полного контроля над компьютером для запускаемой программы. Программы полагаются на «системные вызовы» для ввода / вывода, доступа к аппаратным средствам и тому подобные сигналы и входа в состояние ожидания. Доступные сервисы и интерфейс определяются ОС. ОС также контролирует, какие части системы (память, регистры, прерывания) разрешено использовать программе.

    3. Программа GUI также должна работать через графическую пользовательскую среду, чтобы рисовать себя на экране. Но вы, наверное, уже об этом подумали.

    По этим причинам ОС-независимые приложения должны полагаться на «виртуальную машину» какого-то типа, например, такую, которую предоставляет среда выполнения java. Реально, виртуальная машина обеспечивает стандартный интерфейс для ресурсов ОС (ввода / вывода, сигналов и т. Д.). Конечно, java или python также интерпретируют «байт-код» вместо того, чтобы иметь дело с причудами набора инструкций Intel; Но это совсем другая история.

    Различные операционные системы имеют разную функциональность. У Windows есть порты завершения ввода-вывода, Linux – нет. У FreeBSD есть kqueue, Linux – нет. Linux имеет futexes, Windows – нет. У них также есть разные способы сделать то же самое – какие параметры вы передаете для открытия файла? В каком порядке они идут? Как конкретно вы вызываете функцию «открыть файл» операционной системы?

    В общем, программы несовместимы из-за различий в их двоичном интерфейсе приложений (ABI) .

    Не запускается ли программа непосредственно на CPU?

    НЕТ ! Это задача операционной системы, чтобы приложения не запускались «прямо» на CPU. Как правило, на самом низком уровне (т.е. на том, на котором построен API OS), приложение взаимодействует с ядром операционной системы.

    Это потому, что сама скомпилированная программа должна ссылаться на конкретные библиотеки ОС?

    Да . Многие библиотеки ОС написаны для облегчения взаимодействия с самой операционной системой, но есть так же много, которые написаны как кросс-платформенные. Они скрывают низкоуровневое взаимодействие ОС с разработчиком и предполагают, что скомпилированная версия для этой ОС будет доступна во время выполнения (см. Ниже).

    Хотя библиотеки могут быть написаны кросс-платформенным способом, при компиляции они не могут запускаться межплатформенными. Их все еще необходимо перекомпилировать для конкретной целевой операционной системы, чтобы снова использовать конкретные базовые компоненты операционной системы (ядра).

    В чем разница между скомпилированной программой для одной ОС и другой?

    Наконец, сами исполняемые файлы часто содержат очень конкретные заголовки двоичных загрузок и т. Д. (Например, файл исполняемого файла PE [.exe, .dll и т. Д.]] Для Windows или ELF для Linux [none, .o, .so , и т.д…]). Они также могут включать в себя код для загрузки скомпилированных исполняемых файлов для конкретной библиотеки программного обеспечения.


    Наконец, с точки зрения программиста: вызов конвенции . Скомпилированный код передает переменные функциям определенным образом (то есть через регистры или в стеке) в очень определенном порядке. Даже тогда необходимо также согласовать, кто несет ответственность за «очистку» вызовов функций (вызывающего абонента или вызывающего абонента?). Хотя существует несколько стандартных и широко используемых соглашений о вызовах x86 , некоторые из них могут не поддерживаться некоторыми операционными системами (это часть ABI).

    Давайте будем гением компьютера.