Для чего в состав ядра включается функции ввода вывода

Для чего в состав ядра включается функции ввода вывода

Для чего в состав ядра включается функции ввода вывода. Смотреть фото Для чего в состав ядра включается функции ввода вывода. Смотреть картинку Для чего в состав ядра включается функции ввода вывода. Картинка про Для чего в состав ядра включается функции ввода вывода. Фото Для чего в состав ядра включается функции ввода вывода

Устройства ввода и вывода (I/O) позволяют нам взаимодействовать с компьютерной системой. Ввод-вывод — это передача данных между оперативной памятью и различными периферийными устройствами ввода-вывода. Используя устройства ввода, такие как клавиатуры, мыши, картридеры, сканеры, системы распознавания голоса и сенсорные экраны, мы можем вводить данные в компьютер. Использование устройств вывода, таких как мониторы, принтеры, плоттеры и динамики, позволяет нам получать информацию с компьютера.

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

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

Мы обсудим такие службы ядра, как планирование ввода-вывода, кэширование, буферизация, резервирование устройств, защита ввода-вывода и обработка ошибок.

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

Планирование запросов ввода-вывода может значительно повысить общую эффективность. Приоритеты также могут играть важную роль в планировании запросов и снижать среднее время ожидания завершения ввода-вывода.

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

Это подразумевает хранение копии данных в более быстром месте доступа, чем то, где они обычно хранятся.

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

Буфер-это область памяти, поддерживаемая подсистемой ввода-вывода ядра, которая хранит данные во время их передачи между двумя устройствами или между устройством с приложением.

Буферизация выполняется по трем причинам.

Spool-это тип буфера, который содержит выходные данные для устройства. Это процесс, в котором задания с карт считываются непосредственно на диск, а расположение этой карты на диске записывается в таблицу операционной системой. Когда это задание требуется для выполнения, оно считывается с диска. Например, несколько приложений хотят распечатать свои выходные данные одновременно, поэтому буферизация решает эту проблему, поддерживая очередь для выходных данных. Принтер не принимает чередующиеся данные. Выходные данные всех приложений помещаются в отдельный файл на диске. Когда приложение завершает печать, система буферизации помещает соответствующий файл spool в очередь для вывода на принтер.

5) Резервирование Устройства

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

6) Защита Ввода-Вывода

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

7) Обработка Ошибок

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

Источник

Ввод-вывод

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

Устройства ввода-вывода делятся на два типа:

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

Операционная система обычно имеет дело не с устройством, а с контроллером и выполняет ввод-вывод, записывая команды в регистры контроллера.

Например, контроллер гибкого диска принимает 15 команд, таких как READ, WRITE, SEEK, FORMAT и т.д. Когда команда принята, процессор оставляет контроллер и занимается другой работой. При завершении команды контроллер организует прерывание для того, чтобы передать управление процессором операционной системе, которая должна проверить результаты операции. Процессор получает результаты и статус устройства, читая информацию из регистров контроллера.

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

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

Драйвером устройства называется программа, которая управляет данным устройством и содержит весь специфический для данного устрой­ства код.

Драйвер обычно пишется производителем устройства и поставляется вместе с ним.

Только драйвер устройства знает о его конкретных особенностях. Драйверы принимают от вышележащего уровня некоторые универсальные для всех устройств ввода-вывода команды и переводят их в последова­тельность команд, которые может выполнить контроллер данного устрой­ства.

Типичным запросом, который может получить драйвер, является чтение п бло­ков данных. Драйвер жесткого диска должен, например, преобразовать номера блоков в номера цилиндров, головок, секторов, проверить, работает ли мотор, находится ли го­ловка над нужным цилиндром и т.д.

Драйверы блок-ориентированных и бит-ориентированных устройств предоставляют вышележащему уровню различные интерфейсы.

Задачей этого слоя (вместе с двумя нижележащими) является представление всех устройств ввода-вывода в виде единообразной абстракции. Ранее уже упоминались такие унифицированные абстракций, например, файловая абстракция (файловые потоки, специальные файлы).

Типичными функциями данного слоя являются:

· обеспечение общего интерфейса к драйверам устройств;

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

С именованием устройств тесно связан вопрос защиты устройств от работы с ними тех пользователей, у которых нет на это соответствующих полномочий.

· обеспечение независимого размера блока;

Верхним слоям программного обеспечения неудобно работать с блоками разной величины, поэтому данный слой обеспечивает единый размер блока, например за счет объединения нескольких различных блоков в единый логический блок.

· уведомление об ошибках при работе с устройством.

В этом слое присутствуют программные модули (или даже целостные операционные среды), которые обеспечивают высокоуровневое взаимодействие с соответствующим устройством.

Более детально остановимся на понятии драйвер. Первоначально термин «драйвер» применялся в достаточно узком смысле; под драйвером понимается программный модуль, который:

· входит в состав ядра ОС, работая в привилегированном режиме;

· непосредственно управляет внешним устройством, взаимодействуя с его контроллером с помощью команд ввода-вывода компьютера;

· обрабатывает прерывания от контроллера устройства;

· предоставляет прикладному программисту удобный логический интерфейс работы с устройством, абстрагированный от низкоуровневых деталей управления устройством и организации его данных;

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

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

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

Традиционные драйверы, которые стали называть аппаратными, низкоуровневыми, или драйверами устройств, освобождаются от высокоуровневых функций и занимаются только низкоуровневыми операциями. Эти низкоуровневые операции составляют фундамент, на котором можно построить тот или иной набор операций в драйверах более высоких уровней.

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

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

Высокоуровневые драйверы оформляются по тем же правилам и придерживаются тех же внутренних интерфейсов, что и аппаратные драйверы. Как правило, высокоуровневые драйверы не вызываются по прерываниям, так как взаимодействуют с устройством через посредничество аппаратных драйверов.

В модулях подсистемы ввода-вывода кроме драйверов могут присутствовать и дру­гие модули, например дисковый кэш. Достаточно специфичные функции кэша делают нецелесообразным оформление его в виде драйвера, взаимодействующего с другими модулями ОС только с помощью услуг менеджера ввода-вывода. Другим примером модуля, который чаще всего не оформляется в виде драйвера, является диспетчер окон графического интерфейса. Иногда этот модуль вообще выносится из ядра ОС и реализуется в виде пользовательского интерфейса. Таким образом был реализован диспетчер окон в Windows NT 3.5 и 3.51, но этот микроядерный подход заметно замедляет графические операции, поэтому в Windows 4.0 диспетчер окон и высокоуровневые графические драйверы, а также графическая библиотека GDI были перенесены в пространство ядра.

Аппаратные драйверы после запуска операции ввода-вывода должны своевременно реагировать на завершение контроллером заданного действия путем взаимодействия с системой прерывания. Драйверы более высоких уровней вызываются не по прерываниям, а по инициативе аппаратных драйверов или драйверов вышележащего уровня. Не все процедуры аппаратного драйвера нужно вызывать по прерываниям, поэтому драйвер обычно имеет определенную структуру, в которой выделяется секция обработки прерываний (Interrupt Service Routine, ISR), которая и вызывается от соответствующего устройства диспетчером прерываний.

В унификацию драйверов большой вклад внесла ОС UNIX. Упомянутое ранее деление устройств на блок-ориентированные и байт-ориентированные было впервые введено именно в UNIX. Это более общее деление, чем деление на вертикальные подсистемы.

В свое время ОС UNIX сделала очень важный шаг по унификации операций и структуризации программного обеспечения ввода-вывода. В ОС UNIX все устройства рассматриваются как виртуальные (специальные) файлы, что дает возможность использовать общий набор базовых операций ввода-вывода для любых устройств независимо от их специфики. Подобная идея реализована позже в MS DOS, где последовательные устройства — монитор, принтер и клавиатура считаются файлами со специальными именами: con, prn, con.

Дата добавления: 2015-09-13 ; просмотров: 4 ; Нарушение авторских прав

Источник

Руководство по созданию ядра для x86-системы. Часть 2. Система ввода / вывода

Авторизуйтесь

Руководство по созданию ядра для x86-системы. Часть 2. Система ввода / вывода

Для чего в состав ядра включается функции ввода вывода. Смотреть фото Для чего в состав ядра включается функции ввода вывода. Смотреть картинку Для чего в состав ядра включается функции ввода вывода. Картинка про Для чего в состав ядра включается функции ввода вывода. Фото Для чего в состав ядра включается функции ввода вывода

В прошлой статье я писал о том, как создать простейшее x86-ядро, использующее GRUB, работающее в защищённом режиме и выводящее на экран строку. В этот раз мы подключим к ядру драйвер клавиатуры, который может считывать символы a–z и 0–9 с клавиатуры и выводить их на экран. Весь используемый код можно найти на GitHub.

Для чего в состав ядра включается функции ввода вывода. Смотреть фото Для чего в состав ядра включается функции ввода вывода. Смотреть картинку Для чего в состав ядра включается функции ввода вывода. Картинка про Для чего в состав ядра включается функции ввода вывода. Фото Для чего в состав ядра включается функции ввода вывода

Мы общаемся с устройствами ввода / вывода, используя I/O-порты. Эти порты — просто определённые адреса на шине ввода / вывода x86-системы. Операции чтения / записи на этих портах обрабатываются специальными инструкциями, встроенными в процессор.

Чтение из портов и запись в них

write_port очень похожа. Мы принимаем два аргумента: номер порта и данные для записи. Инструкция out записывает данные в указанный порт.

Прерывания

Теперь, прежде чем мы продолжим писать какой-либо драйвер устройства, давайте разберемся, как процессор узнаёт о том, что устройство совершило действие.

Самое простое решение — это поллинг, постоянная проверка состояния устройства. По очевидным причинам это не самое практичное решение. Тут в дело вступают прерывания. Прерывание — это сигнал, посылаемый процессору аппаратным или системным обеспечением, который оповещает о событии. Используя прерывания, мы можем действовать только тогда, когда возникает интересующее нас прерывание.

Устройство, называемое контроллером прерываний (Programmable Interrupt Controller, PIC), отвечает за обработку аппаратных прерываний и отправку их соответствующим системным прерываниям.

Когда на аппаратном обеспечении происходит какое-то событие, оно отправляет сигнал, называемый запросом прерывания, по свому специальному каналу на контроллер прерываний. Контроллер преобразует запрос в системное прерывание и отправляет его в процессор, где им занимается ядро.

Если бы у нас не было контроллера прерываний, то нам пришлось бы постоянно опрашивать все устройства на наличие произошедших событий.

После этого запускается код, расположенный по этому адресу, и обрабатывает исключение.

Настраиваем IDT

Современные x86-системы имеют два контроллера прерываний по 8 входных линий. Назовём их PIC1 и PIC2. PIC1 получает сигналы с IRQ0 до IRQ7, а PIC2 — с IRQ8 до IRQ15. PIC1 использует порт 0x20 для команд и 0x21 — для данных. PIC2 использует порт 0xA0 для команд и 0xA1 — для данных.

Контроллеры инициализируются 8-битными инициализирующими командными словами (Initialization command words, ICW). Подробный синтаксис этих команд можно изучить здесь.

В защищённом режиме первой командой, которую вы должны передать двум контроллерам прерываний, является инициализирующая команда ICW1 ( 0x11 ). Эта команда заставляет контроллер ждать поступления ещё трёх инициализирующих слов на порт данных.

Эти команды сообщают контроллерам следующее:

Вторая инициализирующая команда — это ICW2, которая записывает в порты данных каждого контроллера его сдвиг.

Контроллеры допускают каскадирование выводов и вводов, что настраивается командой ICW3, но мы не будем его использовать, поэтому установим все значения в ноль.

ICW4 устанавливает дополнительные параметры окружения. Мы заполним младший бит, чтобы сказать контроллерам, что мы работаем в режиме 80×86.

Та-дам! Контроллеры прерываний инициализированы!

У каждого контроллера есть внутренний 8-битный регистр, называющийся регистр масок прерывания (Interrupt Mask Register, IMR). Этот регистр хранит битмэп линий IRQ, идущих в контроллер. Если бит установлен, контроллер игнорирует запрос. Это означает, что мы можем включать и выключать любую линию IRQ, меняя соответствующее значение в IMR. Чтение из порта данных возвращает значение из IMR, а запись — задаёт это значение. В нашем коде мы отключаем все линии IRQ, чтобы позже включить ту, что соответствует клавиатуре.

Если линии IRQ включены, наши контроллеры могут получать идущие по ним сигналы и преобразовывать их в числа прерываний, добавляя сдвиг. Теперь нам нужно найти IDT такую, чтобы число прерывания для клавиатуры было привязано к адресу обработчика событий клавиатуры, который мы напишем.

Какое число прерывания должно соответствовать обработчику событий клавиатуры?

Каждое значение в IDT состоит из 64 битов. В значении IDT для прерывания мы не храним адрес функции-обработчика целиком, а делим его на 2 части по 16 бит. Младшие биты хранятся в первых 16 битах значения IDT, а старшие 16 битов — в последних. Это сделано в целях совместимости с 286. Да, такие костыли от Intel можно встретить часто!

Дескриптор достаточно прост. Он содержит размер IDT в байтах и её адрес. Для хранения значений я использовал массив, но вы можете воспользоваться структурой.

Когда IDT настроена, мы можем включить линию IRQ клавиатуры, используя маску прерываний, о которой мы говорили ранее.

Функция обработки прерываний клавиатуры

В этой статье мы обрабатываем только строчные буквы и цифры. Конечно, можно настроить и обработку других клавиш, а также их сочетаний.

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

Источник

Системы ввода-вывода

Подсистема ввода-вывода в ядре ОС

ОС осуществляет планирование, включая упорядочение запросов на ввод- вывод в очередях к каждому устройству.

ОС обеспечивает буферизацию – запись данных в память в процессе передачи между устройствами. Цели буферизации :

Весьма важна также такая функция ОС, как буферизация вывода (spooling) – задержка вывода на устройство, с целью поддержания целостности информации, выводимой одним и тем же процессом. Типичный пример – печать на принтер.

ОС выполняет также резервирование устройства – обеспечение монопольного доступа к нему. Имеются системные вызовы для занятия и освобождения устройства монопольного доступа. ОС контролирует отсутствие тупиков ( deadlocks ), которые возможны при монопольном использовании устройств.

Структуры данных для ввода-вывода в ядре ОС

Структура модулей ввода-вывода в системе UNIX изображена на рис. 21.5.

Для чего в состав ядра включается функции ввода вывода. Смотреть фото Для чего в состав ядра включается функции ввода вывода. Смотреть картинку Для чего в состав ядра включается функции ввода вывода. Картинка про Для чего в состав ядра включается функции ввода вывода. Фото Для чего в состав ядра включается функции ввода вывода

Жизненный цикл запроса на ввод-вывод

Рассмотрим более подробно процесс чтения из дискового файла. Он состоит из следующих этапов:

Жизненный цикл запроса на ввод- вывод изображен на рис. 21.6.

Для чего в состав ядра включается функции ввода вывода. Смотреть фото Для чего в состав ядра включается функции ввода вывода. Смотреть картинку Для чего в состав ядра включается функции ввода вывода. Картинка про Для чего в состав ядра включается функции ввода вывода. Фото Для чего в состав ядра включается функции ввода вывода

Производительность ввода-вывода

Ввод- вывод – важный фактор в производительности системы. Имеются несколько факторов, определяющих, насколько ввод- вывод критичен по эффективности в системе:

Для чего в состав ядра включается функции ввода вывода. Смотреть фото Для чего в состав ядра включается функции ввода вывода. Смотреть картинку Для чего в состав ядра включается функции ввода вывода. Картинка про Для чего в состав ядра включается функции ввода вывода. Фото Для чего в состав ядра включается функции ввода вывода

Выводы. Для повышения производительности ввода-вывода и сетевого взаимодействия в системе необходимо:

Источник

Системы ввода-вывода

Подсистема ввода-вывода в ядре ОС

ОС осуществляет планирование, включая упорядочение запросов на ввод- вывод в очередях к каждому устройству.

ОС обеспечивает буферизацию – запись данных в память в процессе передачи между устройствами. Цели буферизации :

Весьма важна также такая функция ОС, как буферизация вывода (spooling) – задержка вывода на устройство, с целью поддержания целостности информации, выводимой одним и тем же процессом. Типичный пример – печать на принтер.

ОС выполняет также резервирование устройства – обеспечение монопольного доступа к нему. Имеются системные вызовы для занятия и освобождения устройства монопольного доступа. ОС контролирует отсутствие тупиков ( deadlocks ), которые возможны при монопольном использовании устройств.

Структуры данных для ввода-вывода в ядре ОС

Структура модулей ввода-вывода в системе UNIX изображена на рис. 21.5.

Для чего в состав ядра включается функции ввода вывода. Смотреть фото Для чего в состав ядра включается функции ввода вывода. Смотреть картинку Для чего в состав ядра включается функции ввода вывода. Картинка про Для чего в состав ядра включается функции ввода вывода. Фото Для чего в состав ядра включается функции ввода вывода

Жизненный цикл запроса на ввод-вывод

Рассмотрим более подробно процесс чтения из дискового файла. Он состоит из следующих этапов:

Жизненный цикл запроса на ввод- вывод изображен на рис. 21.6.

Для чего в состав ядра включается функции ввода вывода. Смотреть фото Для чего в состав ядра включается функции ввода вывода. Смотреть картинку Для чего в состав ядра включается функции ввода вывода. Картинка про Для чего в состав ядра включается функции ввода вывода. Фото Для чего в состав ядра включается функции ввода вывода

Производительность ввода-вывода

Ввод- вывод – важный фактор в производительности системы. Имеются несколько факторов, определяющих, насколько ввод- вывод критичен по эффективности в системе:

Для чего в состав ядра включается функции ввода вывода. Смотреть фото Для чего в состав ядра включается функции ввода вывода. Смотреть картинку Для чего в состав ядра включается функции ввода вывода. Картинка про Для чего в состав ядра включается функции ввода вывода. Фото Для чего в состав ядра включается функции ввода вывода

Выводы. Для повышения производительности ввода-вывода и сетевого взаимодействия в системе необходимо:

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *