С без stdio, что можно? - PullRequest
       10

С без stdio, что можно?

6 голосов
/ 30 июня 2011

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

Я прошел K & R, и вся книга включает его в каждый урок.Воспользовавшись им во время изучения C, я не знаю, что я узнал, что использует stdio, а что нет.Что вы можете сделать в C без stdio?

Ответы [ 6 ]

4 голосов
/ 30 июня 2011

Стандарт C (ISO / IEC 9899: 1999) признает два типа реализации (§4 Соответствие, ¶6):

  • Отдельно стоящее - где реализация (компилятор плюс библиотека) предоставляет только семь заголовков:

    <float.h>
    <iso646.h>
    <limits.h>
    <stdarg.h>
    <stdbool.h>
    <stddef.h>
    <stdint.h>
    

    Они предоставляют базовые возможности для языка и не объявляют никаких функций (средства в <stdarg.h> явно определены как макросы в стандарте). Обратите внимание, что он не включает комплексные числа.

  • Размещено - где реализация предоставляет полную библиотеку, определенную стандартом.

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

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

1 голос
/ 30 июня 2011

Другие ответы о минимальной среде C хороши, но вот еще один более абстрактный угол.

Стандарт C определяет два вида "наблюдаемых побочных эффектов", которые в основном означают действия, которые ваша программа делает, которые не могут быть оптимизированы или иным образом изменены компилятором. Во-первых, это вызовы функций ввода-вывода, а во-вторых, чтение и запись volatile объектов.

Если у вас нет доступа к stdio или другим частям вашей реализации C, которые зависят от наличия ОС, вы не можете использовать функции ввода-вывода. Это оставляет чтение и запись в volatile объектов как единственное, что ваша программа на самом деле «сделает». На практике вам может понадобиться, а может и нет, на самом деле отмечать все volatile, поскольку ваша реализация на C, вероятно, предоставляет гарантии, выходящие за рамки стандарта. Если есть инструкция процессора, которая издает звуковой сигнал, ваш компилятор будет рассматривать это (и встроенную сборку в целом) как функцию ввода-вывода, даже если это не действительно функция и т. Д.

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

1 голос
/ 30 июня 2011

Любой загрузчик почти наверняка будет иметь директивы #include, если он плохо спроектирован. Я не знаю, откуда у вас эта цитата, но, возможно, вы ее неправильно поняли. Начальный загрузчик всегда будет начинаться с куска чистого ассемблерного кода для начальной низкоуровневой инициализации процессора и для инициализации среды выполнения C. Этот код просто невозможно написать на C. Но остальная часть кода может быть настолько сложной, насколько это необходимо, с учетом ограничений среды (память и т. Д.).

stdio - это просто набор файловых потоков, подключенных к какому-либо устройству, которое может получать ввод и вывод. Вы можете реализовать stdin, stdout, stderr или любое их подмножество. Вы также можете реализовать файловую систему, для которой вы можете открывать произвольные файловые потоки. В современной ОС это обычно связано с каким-то терминалом, который включает в себя довольно много промежуточных уровней, потому что это виртуальный терминал, который отображается на вашем мониторе и, следовательно, требует графического драйвера и так далее. В примитивной встроенной системе stdio может быть подключен к последовательному порту или светодиодному дисплею.

stdio реализован с функциями read() и write(). Если они не реализованы, вы просто не сможете использовать функции stdio, такие как printf(), fprintf(), fgets() и т. Д. Это не означает, что вы не можете записывать на графический дисплей, последовательный порт или что-то еще , Это просто означает, что у вас нет стандартного средства для этого, и вам нужно будет вызывать пользовательские функции.

Чтобы ответить на ваш вопрос: вы можете делать все в C без stdio. В любом случае, все это написано на C, вы просто теряете некоторые общие функциональные возможности, реализованные в любой стандартной библиотеке C.

1 голос
/ 30 июня 2011

stdio обозначает стандартный ввод / вывод.Как следует из названия, он содержит вещи, связанные со стандартным IO.В статье Википедии о stdio.h указано содержимое stdio.h.Вам понадобится stdio.h, если вы их используете.И вы можете проверить справочную страницу stdio.h также для получения дополнительной информации.

А для части ОС написание ОС - это гораздо больше, чем простое программирование, даже если оно академическое.Прежде чем перейти к этому, вы должны изучить структуры данных, алгоритмы, теории ОС и многое другое. Дизайн операционной системы UNIX - очень хорошая книга для изучения ОС. Nachos - академическая программа симуляции ОС.Вы тоже можете это проверить.И если вы фанатичны по поводу ОС, то вам следует прочитать автобиографию Линуса Торвальдса Just for Fun .Ну, это не техническая книга, но вы почувствуете, что значит писать ОС.

0 голосов
/ 30 июня 2011

C без stdio, что возможно?

Все.stdio.h - это простая и быстрая библиотека, используемая для простых консольных программ и в целях отладки.Как правило: никогда не используйте stdio.h в производственном коде.Это должно относиться ко всем - от низкоуровневых встроенных программистов до высококлассных веб-программистов / программистов-десктопов / пуховиков.

Если вы начнете писать загрузчик с помощью #include, вы уже допустили фатальную ошибку.

С общей точки зрения это просто чепуха.Библиотеки #include всегда компилируются / связываются статически, а не динамически.

Однако может быть целесообразно уменьшить код загрузчика до минимума.Кроме того, нецелесообразно включать ресурсоемкие стандартные библиотеки, такие как stdio.h.

Что еще более важно, если вы пишете загрузчик в компиляторе, предназначенном для конкретной ОС (Windows, Linux и т. Д.), Компилятор будет выполнять вызовы API API изнутри этих библиотечных функций.А поскольку API ОС не будет присутствовать во время загрузки, все такие вызовы функций будут терпеть неудачу.Как реализовать загрузчик, зависит от того, какая у вас система.Возможно, вы могли бы уточнить, если это для ПК или что-то еще?

0 голосов
/ 30 июня 2011

Как упоминается в taskinoor, Википедия предоставляет отличную справку о том, что включено в stdio.h .

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

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

...