Могу ли я выполнить любую c-версию без какой-либо платформы os?

Я обдумал это и где-то читал....

Да, вы можете. Это происходит в случае встроенных систем

Я думаю, что нет, это невозможно. На любой платформе должна быть операционная система. Или же ваша программа сама должна быть ОС. Либо мягкая, либо жесткая. Без операционной системы ваш компонент не будет работать.

Я прав, или кто-нибудь может объяснить мне ответ? (У меня нет идеи для встроенных систем...)

Ответы

Ответ 1

Конечно, вы можете. Все (типичные) потребности в процессорах - это питание и доступ к памяти, затем он выполнит свою жестко запрограммированную последовательность загрузки.

Обычно это связано с чтением некоторого предопределенного адреса, интерпретацией содержимого там в качестве инструкций и началом их запуска.

Эти инструкции могут, конечно, поступать из программы на C, хотя на этом уровне чаще всего записывать самые ранние этапы (называемые начальной загрузкой) в сборке.

Это, конечно, не означает, что если бы я буквально прочитал заголовок вопроса, чтобы любая программа C была запущена таким образом. Если программа предполагает наличие ОС, но ее нет, она не будет работать. Это должно быть довольно очевидно.

Ответ 2

Вы можете запустить программу в системе без операционной системы... и эта программа не должна быть самой операционной системой.

Подумайте обо всех компьютерах (или процессорах, если хотите) внутри автомобиля: управление двигателем, кондиционер, ABS,...,...
У всех этих систем есть программа (возможно, написанная на C). Ни один из процессоров не имеет ОС.

Стандарт специально различает hosted implementations и freestanding implementations:

    5.1.2.1 Freestanding environment
1   In a freestanding environment (in which C program execution may take place
    without any benefit of an operating system), the name and type of the
    function called at program startup are implementation-defined. Any library
    facilities available to a freestanding program, other than the minimal set
    required by clause 4, are implementation-defined.
2   The effect of program termination in a freestanding environment is
    implementation-defined.

    5.1.2.2 Hosted environment
1   A hosted environment need not be provided, but shall conform to the
    following specifications if present.
    ...

Ответ 3

Думаю, вам будет интересно писать "игрушечные" ядра, которые предназначены для работы под такими симуляторами, как QEMU (или платформы виртуализации, Xen + MiniOS - один из моих любимых). С небольшими трудностями вы можете получить базовую консоль и запустить ее и начать печатать на ней. Это действительно весело, образовательно и удовлетворяет все сразу.

Если вы работаете с x86.. и получите свое spiffy ядро, работающее под QEMU.. есть очень хороший шанс, что он также будет работать на реальном оборудовании. Вы можете наслаждаться этим.

В любом случае, ответ на ваш вопрос наиболее решительно да. Это особенно удобно, если вы используете загрузчик. Например, google memtest86 и захватите код.

Ответ 4

Обычно любая программа C будет иметь множество системных вызовов, которые зависят от операционной системы. Например, printf выполняет системный вызов для записи в экранный буфер. Открытие файлов и т.д. Также являются системными вызовами.

В принципе, вы можете запустить код C, который только что скомпилирован и собран в машинный код на процессоре, но если код совершит какие-либо системные вызовы, он просто заморозит процессор, когда он попытается перейти в память местоположение, которое, по его мнению, является операционной системой. Это, конечно, будет зависеть от того, сможете ли вы запустить программу в первую очередь, что нелегко и без операционной системы.

Ответ 5

Встроенные системы являются законными ОС сами по себе, они просто не являются ОС ОС общего назначения. Любая пользовательская программа (т.е. Программа, которая сама по себе не является операционной системой) нуждается в операционной системе для запуска поверх.

Ответ 6

В качестве примера: Создание систем BAR-Metal ARM с GNU

Многие встроенные системы не имеют достаточных ресурсов для полной ОС, некоторые могут использовать ядро ​​планировщика или RTOS, другие кодируются "голым металлом". Точка входа main() C вводится после reset. Для инициализации микропроцессора требуется только небольшое количество кода ассемблера для выполнения кода C. Все C требует запустить, как правило, стек - обычно это просто случай инициализации указателя стека на конкретный адрес. Может потребоваться также определенная процессорная инициализация векторов прерываний/исключений, системных часов, контроллеров памяти и т.д.

На настольном ПК, как правило, у вас есть BIOS, который обрабатывает базовую инициализацию оборудования, такую ​​как настройка и синхронизация контроллера SDRAM, а затем загрузочный процесс с загрузочного сектора диска, который затем, в свою очередь, загружает ОС. Любой из этого кода может быть написан на C (и, возможно, некоторые из них), и он может делать что-то другое, кроме загрузки ОС - он может что-то делать - это всего лишь код.

ОС полезны для не-выделенных вычислительных устройств, где конечный пользователь много выбирает одну из многих программ для выполнения и, возможно, несколько одновременно. Большинство встроенных систем делают только одно: программное обеспечение часто загружается из ПЗУ или выполняется непосредственно из ПЗУ и никогда не изменяется и выполняется бесконечно (обычно останавливается только при отключении питания).

Вы все равно можете реализовать драйверы устройств и т.п., но часто это неотъемлемая часть приложения, а не отдельная сущность. Даже если вы используете RTOS во встроенной системе, она по-прежнему в целом является неотъемлемой частью вашего приложения, а не ОС в том смысле, который вы можете понять. В этих случаях RTOS - это просто библиотека, как и любая другая, и часто инициализируется и запускается из main(), а не наоборот, как вы могли бы ожидать.

Ответ 7

каждый кусок оборудования должен иметь часть программного обеспечения, которое его использует, будь то встроенная прошивка (меньшая и относительно фиксированная, например, vxworks) или программное обеспечение операционной системы, которое может выполнять сложный произвольный код поверх него (например, окна, linux или mac).

думайте об этом как стек. внизу, у вас есть оборудование. Кроме того, часть программного обеспечения, которая может управлять этим оборудованием. Кроме того, вы можете иметь всевозможные вещи. в случае VoIP-телефона у вас будет vxworks, контролирующий аппаратное обеспечение, и слой поверх того, который обрабатывает все телефонные приложения.

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

имеет смысл?

Ответ 8

Очевидно, что вы не можете выполнить произвольную программу C без какой-либо ОС или эквивалентной ОС. Аналогично, я могу написать программу C под Linux, которая не будет работать под Microsoft Windows.

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

Многие встроенные системы имеют только процессор, подключенный к ПЗУ, с выводами, выходящими из чипа, которые напрямую подключены к входам и выходам. Нет ввода/вывода пользователя, нет файловой системы, нет планирования процесса, для чего вы, как правило, не нуждаетесь в ОС. В этих случаях программист С может написать программу, которая сжигается в ПЗУ, которая будет обрабатывать все сама.

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

Ответ 9

Вам определенно не нужна ОС для запуска кода C в любой системе. Вам понадобится два кода инициализации - один для инициализации необходимого оборудования (процессор, часы, память), а другой - для настройки вашего стека и времени выполнения C (т.е. Инициализации данных и разделов BSS). Это, конечно, означает, что вы не можете воспользоваться услугами многопоточности, обмена сообщениями и синхронизации, которые предоставила ОС. Я попытаюсь разбить его на несколько шагов, чтобы дать вам представление:

  • Напишите "reset_routine", который запускается при запуске платы. Это приведет к инициализации часов и любой необходимой внешней памяти. (Эта процедура должна выполняться из внутренней или внутренней памяти, которая может быть инициализирована и запрограммирована извне).
  • Функция reset_routine после инициализации оборудования передает управление подпрограмме "sw_runtime_init", которая будет устанавливать стек и глобальные переменные, определенные вами приложением. (Сделайте переход от reset_routine к sw_runtime_init вместо вызова, чтобы избежать использования стека).
  • Скомпилируйте и привяжите это приложение к вам, в то же время убедитесь, что "reset_routine" связан с местом, где указывает вектор reset.
  • Загрузите это на свою цель и молитесь.