Программное обеспечение ввода / вывода часто организовано на следующих уровнях:
-
Библиотеки уровня пользователя — это обеспечивает простой интерфейс для пользовательской программы для выполнения ввода и вывода. Например, stdio — это библиотека, предоставляемая языками программирования C и C ++.
-
Модули уровня ядра — это обеспечивает драйвер устройства для взаимодействия с контроллером устройства и независимыми от устройства модулями ввода / вывода, используемыми драйверами устройства.
-
Аппаратное обеспечение — этот уровень включает в себя фактический аппаратный и аппаратный контроллер, который взаимодействует с драйверами устройства и обеспечивает работу оборудования.
Библиотеки уровня пользователя — это обеспечивает простой интерфейс для пользовательской программы для выполнения ввода и вывода. Например, stdio — это библиотека, предоставляемая языками программирования C и C ++.
Модули уровня ядра — это обеспечивает драйвер устройства для взаимодействия с контроллером устройства и независимыми от устройства модулями ввода / вывода, используемыми драйверами устройства.
Аппаратное обеспечение — этот уровень включает в себя фактический аппаратный и аппаратный контроллер, который взаимодействует с драйверами устройства и обеспечивает работу оборудования.
Ключевой концепцией в разработке программного обеспечения ввода / вывода является то, что оно должно быть независимым от устройства, где должна быть возможность писать программы, которые могут получить доступ к любому устройству ввода / вывода без необходимости предварительно указывать устройство. Например, программа, которая считывает файл как ввод, должна иметь возможность считывать файл с дискеты, жесткого диска или компакт-диска без необходимости изменять программу для каждого отдельного устройства.
Драйверы устройств
Драйверы устройств — это программные модули, которые можно подключить к ОС для работы с конкретным устройством. Операционная система получает помощь от драйверов устройств для обработки всех устройств ввода-вывода. Драйверы устройств инкапсулируют код, зависящий от устройства, и реализуют стандартный интерфейс таким образом, чтобы код содержал специфичные для устройства регистры чтения / записи. Драйвер устройства, как правило, записывается производителем устройства и поставляется вместе с устройством на компакт-диске.
Драйвер устройства выполняет следующие задания:
- Чтобы принять запрос от устройства независимого программного обеспечения выше к нему.
- Взаимодействовать с контроллером устройства для получения и ввода-вывода и выполнения необходимой обработки ошибок
- Убедиться, что запрос выполнен успешно
Драйвер устройства обрабатывает запрос следующим образом. Предположим, что запрос приходит на чтение блока N. Если драйвер не используется в момент поступления запроса, он начинает выполнять запрос немедленно. В противном случае, если драйвер уже занят каким-либо другим запросом, он помещает новый запрос в очередь ожидающих запросов.
Обработчики прерываний
Обработчик прерываний, также известный как подпрограмма обслуживания прерываний или ISR, является частью программного обеспечения или, более конкретно, функцией обратного вызова в операционной системе или, более конкретно, в драйвере устройства, выполнение которого инициируется приемом прерывания.
Когда происходит прерывание, процедура прерывания делает все возможное, чтобы обработать прерывание, обновляет структуры данных и запускает процесс, который ожидал прерывания.
Механизм прерываний принимает адрес ─ число, которое выбирает конкретную процедуру / функцию обработки прерываний из небольшого набора. В большинстве архитектур этот адрес является смещением, хранящимся в таблице, называемой таблицей векторов прерываний. Этот вектор содержит адреса памяти специализированных обработчиков прерываний.
Независимое от устройства программное обеспечение ввода / вывода
Основная функция независимого от устройства программного обеспечения состоит в том, чтобы выполнять функции ввода-вывода, которые являются общими для всех устройств, и обеспечивать единый интерфейс с программным обеспечением уровня пользователя. Хотя написать полностью независимое от устройства программное обеспечение сложно, мы можем написать некоторые модули, которые являются общими для всех устройств. Ниже приведен список функций независимого от устройства программного обеспечения ввода-вывода.
- Единый интерфейс для драйверов устройств
- Именование устройства — Мнемонические имена сопоставляются с номерами устройств Major и Minor.
- Защита устройства
- Предоставление независимого от устройства размера блока
- Буферизация, поскольку данные, поступающие с устройства, не могут быть сохранены в конечном месте назначения.
- Распределение памяти на блочных устройствах
- Распределение и выпуск выделенных устройств
- Отчет об ошибках
User-Space I / O Software
Это библиотеки, которые предоставляют более богатый и упрощенный интерфейс для доступа к функциональности ядра или в конечном итоге взаимодействуют с драйверами устройств. Большая часть программного обеспечения ввода-вывода пользовательского уровня состоит из библиотечных процедур, за некоторыми исключениями, таких как спулинговая система, которая является способом работы с выделенными устройствами ввода-вывода в многопрограммной системе.
Библиотеки ввода / вывода (например, stdio) находятся в пользовательском пространстве, чтобы предоставить интерфейс к независимому от устройства резидентному программному обеспечению ввода / вывода. Например, putchar (), getchar (), printf () и scanf () являются примером stdio библиотеки ввода-вывода пользовательского уровня, доступной в C-программировании.
Подсистема ввода / вывода ядра
Подсистема ввода / вывода ядра отвечает за предоставление многих услуг, связанных с вводом / выводом. Ниже приведены некоторые из предоставляемых услуг.
Планирование — ядро планирует набор запросов ввода-вывода для определения правильного порядка их выполнения. Когда приложение выполняет системный вызов блокирующего ввода-вывода, запрос помещается в очередь для этого устройства. Планировщик ввода-вывода ядра изменяет порядок очереди, чтобы повысить общую эффективность системы и среднее время отклика, испытываемое приложениями.
Буферизация — Подсистема ввода-вывода ядра поддерживает область памяти, известную как буфер, в котором хранятся данные, когда они передаются между двумя устройствами или между устройствами с операцией приложения. Буферизация выполняется для устранения несоответствия скорости между производителем и потребителем потока данных или для адаптации между устройствами, которые имеют разные размеры передачи данных.
Кеширование — Ядро поддерживает кеш-память, которая является областью быстрой памяти, в которой хранятся копии данных. Доступ к кэшированной копии более эффективен, чем доступ к оригиналу.
Буферизация и резервирование устройства. Буфер — это буфер, который содержит выходные данные для устройства, такого как принтер, который не может принимать чередующиеся потоки данных. Система буферизации копирует файлы очереди из очереди по очереди на принтер. В некоторых операционных системах спулинг управляется процессом системного демона. В других операционных системах это обрабатывается потоком ядра.
Обработка ошибок — операционная система, которая использует защищенную память, может защитить от многих видов аппаратных и прикладных ошибок.