Первый шаг к запуску одного и того же скомпилированного тела кода на нескольких системах на собственной скорости без перекомпиляции - это выбрать один набор инструкций процессора и выбросить все другие системы.Если вы выбираете Intel, то вы должны выбросить ARM, MIPS, PowerPC и т. Д., Поскольку инструкции по машинному коду для одной архитектуры совершенно непонятны другим процессорам.
ОК.Поэтому теперь задача состоит в том, чтобы запускать одно и то же тело скомпилированного собственного кода на нескольких системах (все с использованием одной и той же архитектуры процессора) на собственной скорости без перекомпиляции.В общем, вы хотите запускать один и тот же код в разных операционных системах на одном и том же оборудовании.
Если аппаратные средства одинаковы, и единственная разница заключается в операционной системе, то тривиальный ответ - да, вы можете сделать это, если сможете написать свой код, не обращаясь к операционной системе.Нет выделения памяти.Нет вывода на консоль.Нет файлового ввода / вывода.Нет сетевого ввода / вывода.Не весело.
Кроме того, ваш код должен быть написан таким образом, чтобы код не требовал исправлений перемещения адресов, поскольку каждая операционная система имеет различные способы представления перемещаемого кода.Один из способов сделать это - разместить ваш код на диске в точности так, как он выглядит в памяти, включая резервирование пространства для использования для записи данных (глобальные переменные, стек и куча).Затем все, что вам нужно сделать для запуска кода, это скопировать байты файла в память по заранее определенному базовому адресу и перейти к начальному адресу.
Формат исполняемых файлов MSDOS .com делает это как минимум с 1981 года, а CP / M задолго до этого.
Однако в MSDOS не было современных сканеров вирусов для борьбы стогдаВирусные сканеры очень взволнованы, когда кто-либо, кроме хост-ОС, загружает данные файлов в память и пытается выполнить эту память.Потому что, знаете, это именно то, что делают вирусы.
Поскольку каждая ОС имеет свой собственный формат исполняемых файлов, вам также необходимо выяснить, как поместить свой блок «безупречного» нативного кода в память на всехэти разные операционные системы.Вам понадобится как минимум один загрузчик программ, скомпилированный для каждой операционной системы, в которой вы хотите запустить свой блок нативного кода. Пока вы пишете загрузчик программ для каждой ОС, на которую вы хотите ориентироваться, вы также можете определить свой собственный файл I /O функции, которые отображаются на собственные эквиваленты ОС, так что ваш блок собственного кода может выполнять файловый ввод / вывод в любой системе.То же самое для консольного ввода-вывода или графического вывода.
Ой, подождите - это именно то, что делает WINE.
Именно поэтому частоты кадров, которые вы видите в WINE, намного ниже, чем те же операции в хост-ОС - WINE переводит графические вызовы Win32 GDI в нечто, предоставляемое собственной хост-ОС (Linux -> XWindows)и там, где нет точного соответствия функции или если есть семантическое несоответствие операции (что часто имеет место), WINE должен реализовать всю функциональность самостоятельно, иногда с большими затратами.
Но учитываяПовсеместное использование стандартизированного оборудования, такого как диски IDE, USB-устройства и функции BIOS, может быть, вам не нужно тратить время на сопоставление собственных переносимых API-интерфейсов с тем, что встроено в ОС. Просто напишите небольшой код для файла I/ O для IDE-устройств, выводить графики с использованием функций VESA BIOS.Если вы немного абстрагируете код, вы можете поддерживать несколько видов оборудования и выбирать соответствующий указатель функции для использования в зависимости от того, какое оборудование вы найдете во время выполнения.
Тогда вы могли бы действительно запустить свой блок собственного кода в любой системе (используя одну конкретную архитектуру процессора) на собственной скорости без перекомпиляции.
Ой, подождите - вы только что написали свою собственную ОС.;>