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