Подтвердить что ты не робот

Можно ли полностью написать операционную систему в C?

Можно ли полностью написать операционную систему в C?

Полностью, я включаю все до загрузчика, но не BIOS/UEFI.

4b9b3361

Ответ 1

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

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

Posix определяет набор функций setcontext, getcontext, makecontext и swapcontext (почти всегда написанный хотя бы частично в ассемблере), который позволит вам читать и записывать указатель стека и рамки.

К сожалению, семейство функций setcontext широко не реализовано.

Ответ 2

Теоретически да, но не все.

Для загрузочного загрузчика и материала в реальном режиме вы можете найти старый 16-битный компилятор (например, Turbo C), сказать ему, чтобы он выводил обычный двоичный файл и записывал все это с ним.
Или, альтернативно, в GCC вы можете поместить asm(".code16gcc") в начало своего кода, но я не предлагаю этого, так как GCC не может выводить напрямую 16-битный код, программа сборки результатов может принимать более 512 байт.

Для других вещей аннулирование использования сборки невозможно.
Да, вы можете скрыть все сборочные линии внутри встроенных функций (IN\OUT, CRx-регистры и прочее), но для других вещей, таких как прерывания, вы будете вынуждены использовать сборку.

Edit:
Теперь GCC (4.9.0) поддерживает параметр -m16, который позволяет генерировать 16-битное кодирование, поэтому использование сборки может быть дополнительно уменьшено для таких вещей, как bootsector/bootloader (некоторые бит все равно потребуют его, хотя).

Ответ 3

Это зависит от того, что вы подразумеваете под C.

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

Можно написать операционную систему, которая состоит из программы C и предоставляет только вход/выход через объекты C, но это не ОС, работающая на реальном оборудовании. Таким образом вы можете создать эмулятор для машины и ее операционной системы.

Если вы разрешаете поведение, специфичное для реализации, тогда ответ тривиально да, потому что реализациям разрешено добавлять любые расширения, которые они сочтут нужным. Определенно возможно иметь реализацию C, где operating_system(); является исходным кодом программы, которая реализует операционную систему.

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