ввод и вывод без библиотеки на С - PullRequest
4 голосов
/ 04 апреля 2009

Я пишу небольшое ядро ​​для своих программ на C.

Это не (на данный момент) ядро ​​ОС, для меня это просто способ отслеживать ввод и вывод в программах без использования внешнего источника (т.е. stdio.h). Вы можете спросить меня, почему я хочу это сделать; Просто я знаю, как это работает, и теперь у меня есть все больше и больше (конечная цель общая) контроля над ходом программы.

Мне было интересно, знает ли кто-нибудь какие-нибудь учебники по вводу и выводу на C (с встроенным asm?), Не полагаясь на какой-либо другой код.

Ответы [ 3 ]

7 голосов
/ 05 апреля 2009

Между голым металлом и stdio достаточно места. Вы сказали, что не пишете ядро ​​ОС, но не знаете, работаете ли вы под ОС.

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

Работая в ОС, вы, вероятно, не получаете (и не должны получать) доступ к реальным аппаратным регистрам и прерываниям. Если вы разрабатываете пользовательское устройство ввода-вывода, лучше всего привести его в соответствие с существующими стандартами, чтобы вам требовалось как можно меньше пользовательского программного обеспечения низкого уровня. Вот почему вы видите множество пользовательских гаджетов, подключающихся через USB и идентифицирующих себя как HID (Human Interface Devices). Как HID, существующие драйверы USB заботятся о физическом уровне, а поставляемый ОС драйвер HID заботится о логическом интерфейсе, обеспечивая очень простой API доступа высокого уровня к приложению.

Одной из ключевых ролей операционной системы является обеспечение согласованного API ввода-вывода для всех устройств. Как правило, это принимает форму функций open(), close(), read(), write() и ioctl() (имена могут различаться, но всегда будет существовать некоторая форма по меньшей мере первых четырех). Однако уровень ОС довольно сырой. Как правило, вызов ОС перенаправляется без особой обработки в драйвер устройства, который затем передает данные на устройство. Обычно низкоуровневые вызовы ОС блокируют вызывающую программу до завершения, и часто они имеют ограничения на размеры буферов, которые имеют смысл. Например, необработанный доступ к дисковому устройству обычно требуется для целого числа дисковых блоков одновременно.

И не забывайте о таких вещах, как файловые системы и сетевые протоколы ... все они сделаны намного более надежными и совместимыми благодаря инкапсуляции в операционной системе.

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

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

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

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

5 голосов
/ 04 апреля 2009

Подобные вещи очень специфичны для архитектуры. Проще говоря, ваши устройства ввода-вывода будут вызывать аппаратные прерывания для процессора. ЦП вызовет код, связанный с прерыванием, который будет обрабатывать его соответствующим образом; для устройства ввода оно будет извлекать данные, доступные с устройства, для устройства вывода прерывание обычно означает, что устройство готово отправить следующий фрагмент.

Старая архитектура процессора 8088/8086 - хорошее простое место, чтобы начать думать об этом. Как правило, в BIOS будут обрабатываться аппаратные прерывания, но всегда можно написать свои собственные. ;)

3 голосов
/ 04 апреля 2009

Вы должны использовать вызовы BIOS, Int 10h - вызов для записи видеопамяти.

http://hdebruijn.soo.dto.tudelft.nl/newpage/interupt/out-0100.htm

http://en.wikipedia.org/wiki/BIOS_call

...