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