О чем вы говорите, это то, что известно во встроенном мире как приложение «голый металл». Они очень распространены для таких вещей, как ARM Cortex-M3, который входит (скажем) в блок проверки подлинности дебетовой карты или интерактивную игрушку и не имеет достаточной памяти или возможности для запуска полной операционной системы. Таким образом, вместо компилятора «ARM/Linux», который бы скомпилировал приложение для работы в Linux на ARM-процессоре, вы получаете компилятор «ARM bare-metal», который компилирует все, что нужно запустить на ARM-процессоре без операционной системы. (В качестве примера я использую ARM, а не x86, потому что в настоящее время очень редко встречаются приложения с открытым кодом x86.)
Как указано в ответе на ваш вопрос и в других ответах, вашему приложению потребуется выполнить некоторые действия, которые иначе операционная система будет заботиться об этом.
Во-первых, ему необходимо инициализировать систему памяти, векторы прерываний и различные другие бит платы. Как правило, это то, что компилятор с голыми металлами сделает для вас, хотя, если у вас есть странная доска, вам может понадобиться рассказать ей, как это сделать. Это получает вещи с того места, где доска включается в точку, где начинается ваша функция main().
Затем вам необходимо взаимодействовать с вещами вне ЦП и ОЗУ. Операционная система включает в себя всевозможные функции для этого: дисковый ввод-вывод, вывод экрана, ввод клавиатуры и мыши, создание сетей и т. Д. И т. Д. И т. Д. Без операционной системы вы должны получить это откуда-то еще. Вы можете получить некоторые из этих библиотек от вашего производителя оборудования; например, плата, с которой я недавно играл, имеет 40x200-пиксельный светодиодный экран, и в нее входит библиотека с кодом для включения этого и установки на нее отдельных значений пикселей. И есть несколько компаний, которые продают библиотеки для реализации стека TCP/IP и т. Д., Для создания сетей или чего-то еще.
Рассмотрите, например, что это затрудняет выполнение даже основной печати. Когда у вас есть операционная система, printf просто отправляет сообщение в операционную систему, которое говорит «поместите эту строку на консоль», и операционная система находит текущую позицию курсора на консоли и делает все, что нужно, чтобы выяснить, какие пиксели изменить на экране и какие инструкции процессора использовать для изменения этих пикселей, чтобы это сделать.
О, и мы упоминали, что вам сначала нужно выяснить, как получить программу в CPU? Типичный компьютер имеет немного программируемого ПЗУ, которое будет загружать инструкции с момента его запуска. На x86 это BIOS, и он обычно уже содержит удобную программу, которая запускает процессор, настраивает дисплей, ищет диски и загружает программу с диска, который он находит. Во встроенной системе обычно используется ваша программа, что означает, что вам нужно каким-то образом разместить свою программу. Часто это означает, что у вас есть устройство, называемое «отладчиком», физически прикрепленным к встроенной плате, которое загружает программу, а также может делать то, что позволяет вам приостанавливать работу процессора и определять его состояние, чтобы вы могли шагнуть через вашу программу, как если бы вы запускали ее в программном отладчике на вашем компьютере. Но я отвлекся.
В любом случае, чтобы ответить на ваш второй вопрос, этот исполняемый файл, который вы создали, является тем, что хранится в этом ПЗУ на встроенной плате, или, может быть, вы просто сохраните его немного в ROM (то есть, в конце концов, довольно маленький) и сохраните остальную часть на флеш-накопителе, а бит в ПЗУ будет содержать инструкции, чтобы получить остальную часть от флеш-накопителя. Вероятно, он будет храниться в виде файла на вашем основном компьютере (то есть на компьютере под управлением Linux или Windows, где вы его создаете), но это просто для хранения, он не будет работать там.
Вы заметите, что когда у вас есть много этих библиотек вместе, они выполняют справедливую часть того, что делает операционная система, и существует такое пространство между кучей библиотек и реальной операционной система. В этом пространстве идет так называемая RTOS - «операционная система реального времени». Меньшие из них на самом деле представляют собой просто коллекции библиотек, которые работают вместе, чтобы выполнять все операционные системы, а иногда также включают в себя материал, чтобы вы могли одновременно запускать несколько потоков (а затем вы можете использовать разные потоки, как разные программы) - - хотя все это все скомпилировано в одну и ту же скомпилированную «программу», а RTOS - это не что иное, как библиотека, которую вы включили. Большие из них начинают хранить части кода в разных местах, и я думаю, что некоторые из них могут даже загружать фрагменты кода с дисков - точно так же, как Windows и Linux при запуске программы. Это своего рода континуум, а не как/или.
Система FreeRTOS - это ОСРВ с открытым исходным кодом, которая направлена на меньший конец пространства RTOS; они могут быть хорошим местом, чтобы взглянуть на некоторые из них, если вас больше интересует. У них есть несколько примеров приложений x86, которые дадут вам представление о том, какие системы x86 будут запускать программу на основе простого или RTOS-приложения и как вы скомпилируете что-то для запуска на одном; ссылка: http://www.freertos.org/a00090.html#186.
Компилятор Intel - это не то, что вы думаете - это просто другой компилятор Windows (или Linux, они делают оба), который, по-видимому, написан Intel. Это делает EXE или стандартные Linux-файлы. –