Есть части типичного ядра, где необходимо делать вещи, которые C не поддерживает, включая:
- доступ к специальным регистрам ЦП (например, управляющие регистры и MSR в 80x86)
- доступ к специальным функциям процессора (например,
CPUID
, LGDT
, LIDT
инструкции для 80x86)
- управление виртуальными адресными пространствами (например, аннулирование TLB)
- сохранение и загрузка состояния при переключении задач
- доступ к специальным адресным пространствам (например, порты ввода-вывода в 80x86)
- поддержка способов переключения уровней привилегий процессором
Чтобы написать ОС на чистом C, вам нужно либо избегать всех этих вещей (которые могут быть жестко ограничивающими - например, однозадачность, одноадресное пространство, без защиты, без IRQ, ...), либо обманывать путем добавление «расширений, определенных нестандартной реализацией» к C.
Обратите внимание, что количество необходимых вам сборок очень мало, например, ядру, состоящему из 5 миллионов строк C, может потребоваться только 100 строк встроенной сборки, что составляет «0,00% кода (с небольшой ошибкой округления)».
Для загрузочного кода / загрузчика; это зависит от среды загрузки. Например, если вы загрузились с прошивки UEFI, то это не проблема (поскольку его API предназначен для языков высокого уровня), но если вы загрузились с прошивки BIOS, вы не можете использовать только C (из-за «неподдерживаемых» соглашений о вызовах).