Любой загрузчик почти наверняка будет иметь директивы #include, если он плохо спроектирован. Я не знаю, откуда у вас эта цитата, но, возможно, вы ее неправильно поняли. Начальный загрузчик всегда будет начинаться с куска чистого ассемблерного кода для начальной низкоуровневой инициализации процессора и для инициализации среды выполнения C. Этот код просто невозможно написать на C. Но остальная часть кода может быть настолько сложной, насколько это необходимо, с учетом ограничений среды (память и т. Д.).
stdio - это просто набор файловых потоков, подключенных к какому-либо устройству, которое может получать ввод и вывод. Вы можете реализовать stdin, stdout, stderr или любое их подмножество. Вы также можете реализовать файловую систему, для которой вы можете открывать произвольные файловые потоки. В современной ОС это обычно связано с каким-то терминалом, который включает в себя довольно много промежуточных уровней, потому что это виртуальный терминал, который отображается на вашем мониторе и, следовательно, требует графического драйвера и так далее. В примитивной встроенной системе stdio может быть подключен к последовательному порту или светодиодному дисплею.
stdio реализован с функциями read()
и write()
. Если они не реализованы, вы просто не сможете использовать функции stdio, такие как printf()
, fprintf()
, fgets()
и т. Д. Это не означает, что вы не можете записывать на графический дисплей, последовательный порт или что-то еще , Это просто означает, что у вас нет стандартного средства для этого, и вам нужно будет вызывать пользовательские функции.
Чтобы ответить на ваш вопрос: вы можете делать все в C без stdio. В любом случае, все это написано на C, вы просто теряете некоторые общие функциональные возможности, реализованные в любой стандартной библиотеке C.