Можно ли реализовать небольшую дисковую ОС на C или C ++? - PullRequest
10 голосов
/ 21 июля 2011

Я не пытаюсь сделать что-либо подобное, но мне было любопытно, может ли кто-нибудь реализовать «целую ОС» (не обязательно что-то большое, такое как Linux или Microsoft Windows, но больше похоже на маленькая DOS-подобная операционная система) на C и / или C ++ без использования или с небольшой сборкой.

Под реализацией ОС я подразумеваю создание ОС с нуля, начиная загрузчик и ядро ​​с графическими драйверами (и, возможно, с графическим интерфейсом) на C или C ++. Я видел несколько вещей низкого уровня, выполненных в C ++ путем доступа к функциям низкого уровня через компилятор. Можно ли это сделать для всей ОС?

Я не спрашиваю, хорошая ли это идея, я просто спрашиваю, возможно ли это хотя бы отдаленно?

Ответы [ 3 ]

11 голосов
/ 21 июля 2011

Обязательная ссылка на вики OSDev , которая описывает большинство шагов, необходимых для создания ОС, как описано в x86 / x64.

Чтобы ответить на ваш вопрос, будет крайне сложно / неприятно создать загрузчик и запустить защищенный режим, не прибегая к хотя бы некоторой сборке, хотя его можно свести к минимуму (особенно если вына самом деле не считая таких вещей, как использование __asm__ ( "lidt %0\n" : : "m" (*idt) ); в качестве «сборки»).

Большим препятствием (опять же на x86) является то, что процессор запускается в 16-битном реальном режиме, поэтому вам нужен некоторый 16-битный код.В соответствии с этим обсуждением вы можете заставить GCC генерировать 16-битный код, но вам все равно потребуется какой-то способ настройки памяти, загрузки кода с некоторых носителей информации и т. Д. Все это требует взаимодействия с оборудованием вспособы, которыми стандартный C просто не имеет понятия (прерывания, порты ввода-вывода и т. д.).

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

4 голосов
/ 21 июля 2011

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

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

Достаточно взглянуть на Linux source kernel , самый важный код ассемблера (для x86) можно найти в arch / x86 / boot, но вы заметите, что даже в этом каталоге большинство файлов написанный на C. Кроме того, вы найдете несколько сборочных строк в каталоге arch / x86 / kernel для обработки системных вызовов и тому подобного.

За пределами каталога arch практически не используется ассемблер (поскольку ассемблер зависит от компьютера, этот машинный код принадлежит каталогу arch). Даже графические драйверы не используют ассемблер (например, драйвер nvidia в drivers / gpu / drm / nouveau).

0 голосов
/ 22 июля 2011

загрузчик? Вы можете пропустить этот бит. Например, Linux довольно часто запускается не-Linux загрузчиками, такими как UBoot . В конце концов, как только система запустится, ОС будет присутствовать, но не загрузчик, это просто для того, чтобы правильно загрузить ОС в память.

И после того, как вы выбрали достойный существующий загрузчик, все остальное довольно просто. Ну, вы должны иметь дело с памятью и файлами самостоятельно; Вы не можете полагаться на fopen очевидно. Но даже у компилятора C ++ есть небольшие проблемы с генерацией кода, который может работать без поддержки ОС.

...