Можно ли реализовать небольшую дисковую ОС на C или c++?

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

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

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

3 ответов


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

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

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

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


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

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

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

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


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

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