Можно ли использовать stdio при кодировании ядра ...? - PullRequest
5 голосов
/ 17 июня 2011

Мне нужно создать ОС, очень маленькую и базовую, с наименьшим количеством функциональности, написанную на C.

Вероятно, операционная система CUI, которая выполняет некоторое управление памятью и имеет, по крайней мере, текстовый редактор и калькулятор, будет просто экспериментом по созданию кода, который имеет полный и прямой контроль над вашим оборудованием.

Тем не менее, мне потребуется интерфейс, для которого потребуются функции ввода / вывода, такие как printf (& args), scanf (& args). Теперь мой основной вопрос заключается в том, использовать ли существующие заголовки или начать писать код с нуля, и почему так?

Я был бы очень благодарен вам, ребята, за помощь.

Ответы [ 3 ]

3 голосов
/ 17 июня 2011

Во-первых, вы не можете ссылаться на что-либо из libc ... вам придется кодировать все с нуля.

Теперь, работая над микроядром самостоятельно, я бы не сталиспользуйте фактические stdio заголовки, которые поставляются с libc, поскольку они будут загромождены большим количеством дополнительной информации, которая будет либо неактуальной для вашей ОС, либо создаст ошибки компилятора из-за пропущенных определений и т. д. Что я сделает , но при этом сохранит сигнатуры функций для этих стандартных функций одинаковыми ... так что в итоге у вас будет файл с именем stdio.h для вашей ОС, но это будет очень урезанный заголовочный файл сбазовые минимальные требования для ваших нужд и наличие только необходимых вам стандартных функций ввода-вывода с правильными стандартными сигнатурами.

Помните о бэкэнде, т. е. в файле stdio.c,вам нужно будет указать эти функции на пользовательский драйвер консоли или другой символьный диск для вашего дисплея.Либо так, либо вы можете просто использовать их в качестве оболочки для какой-либо другой процедуры печати экрана на уровне ядра.Вы также захотите убедиться, что, даже если вы можете использовать директиву #include <stdio.h> в других своих модулях кода ОС для доступа к этим функциям печати, вы не будете ссылаться на libc.Это можно сделать с помощью gcc -ffreestanding.

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

Само ядро ​​не потребует функций printf и scanf, если вы не хотите держать ядро ​​в режиме ядра и работать с приложениями, для которых вы запланировали. Но для основных функций printf и scanf вы можете написать свои собственные функции printf и scanf, которые обеспечат базовую поддержку печати и ввода данных. У меня нет большого опыта в этом, но вы можете попробовать создать консольный буфер, в котором драйвер клавиатуры помещает чтение в символы ASCII (после преобразования из кодов сканирования), а затем заставляет printf и scanf работать с ним , У меня есть одна базовая реализация, где я написал gets вместо scanf и держал вещи простыми. Чтобы получить целочисленный вывод, вы можете написать функцию atoi для преобразования строки в число.

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

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

Просто перенастроить newlib.

printf, scanf, и т. Д. Полагается на функции, специфичные для реализации, для получения одного символа или печати одного символа. Затем вы можете сделать свои stdin и stdout UART 1, например.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...