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

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

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

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

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

Ответы [ 9 ]

19 голосов
/ 12 ноября 2009

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

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

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

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

6 голосов
/ 12 ноября 2009

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

Подумайте обо всех компьютерах (или процессорах, если вы предпочитаете) в автомобиле: управление двигателем, кондиционер, 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.
    ...

4 голосов
/ 12 ноября 2009

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

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

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

2 голосов
/ 12 ноября 2009

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

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

1 голос
/ 12 ноября 2009

В качестве примера: Построение Bare-Metal ARM систем с GNU

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

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

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

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

1 голос
/ 12 ноября 2009

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

0 голосов
/ 20 ноября 2009

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

  1. Напишите «reset_routine», которая запускается при запуске платы. Это инициализирует часы и любую необходимую внешнюю память. (Эта процедура должна выполняться из памяти, которая является либо внутренней, либо той, которая может быть инициализирована и запрограммирована извне).
  2. reset_routine после аппаратной инициализации передает управление подпрограмме "sw_runtime_init", которая установит стек и глобальные переменные, определенные вашим приложением. (Сделайте переход от reset_routine к sw_runtime_init вместо вызова, чтобы избежать использования стека).
  3. Скомпилируйте и свяжите это с вашим приложением, убедившись, что «reset_routine» связан с местом, на которое указывает вектор сброса.
  4. Загрузи это на свою цель и помолись.
0 голосов
/ 12 ноября 2009

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

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

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

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

0 голосов
/ 12 ноября 2009

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

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

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

имеет смысл?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...