Что произошло, когда на клавиатуре была набрана буква А....

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


предисловие

Можно сказать, что клавиатура является наиболее часто используемым аппаратным устройством ввода, но как программист вы знаете:При наборе буквы А на клавиатуре что происходит во время работы операционной системы?"?

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


текст

контроллер устройства

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

Чтобы скрыть различия между устройствами, каждое устройство имеетконтроллер устройства (Device Control)компоненты, такие как контроллер жесткого диска с контроллером жесткого диска, дисплей с видеоконтроллером и т. д.

计算机 I/O 系统结构

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

Контроллер устройства имеет микросхему, которая может выполнять свою собственную логику и имеет собственные регистры для связи с ЦП, например:

  • Записывая в эти регистры, операционная система может дать команду устройству отправить данные, получить данные, включить или выключить его или выполнить какое-либо другое действие.
  • Читая эти регистры, операционная система может узнать состояние устройства, готово ли оно к приему новой команды и т. д.

На самом деле в контроллере три типа регистров, эторегистр состояния (Status Register),регистр команд (Command Register)так же какрегистр данных (Data Register),Как показано ниже:

Роль этих трех регистров:

  • регистр данных, ЦП записывает данные для передачи на устройство ввода-вывода.Например, если содержимое, которое должно быть напечатано, является «Hello», ЦП должен сначала отправить символ H на соответствующее устройство ввода-вывода.
  • регистр команд, ЦП отправляет команду, чтобы указать устройству ввода-вывода выполнить операции ввода-вывода, поэтому оно будет передано устройству ввода-вывода для работы.После завершения задачи статус в регистре состояния будет отмечен как завершено.
  • регистр состояния, цель состоит в том, чтобы сообщить ЦП, что он уже работает или работа была завершена.Если он уже находится в рабочем состоянии, ЦП бесполезно отправлять данные или команды, пока предыдущая работа не будет завершена, статус регистр помечается как завершенный, и ЦП отправляет следующий символ и команду.

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

Кроме того, устройства ввода и вывода можно разделить на две категории:блочное устройство (Block Device)а такжесимвольное устройство (Character Device).

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

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

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

Это сделано для уменьшения частоты включения устройства.

Так как же процессор взаимодействует с регистрами управления и буферами данных устройства? Есть два метода:

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

Метод управления вводом/выводом

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

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

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

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

Однако метод прерывания не подходит для дисков, которые часто считывают и записывают данные, поэтому ЦП легко часто прерывается, что занимает много времени ЦП. Решение проблемы с этим типом устройства заключается в использованиипрямой доступ к памяти (Direct Memory Access)Это позволяет устройству самостоятельно помещать данные ввода-вывода устройства в память без участия ЦП. Для реализации функции прямого доступа к памяти должна быть поддержка аппаратного обеспечения «контроллера прямого доступа к памяти».

ДМА работает следующим образом:

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

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


драйвер устройства

Хотя контроллер устройства скрывает многие детали устройства, регистры, буферы и другие режимы использования контроллера каждого устройства различны, поэтому для того, чтобы скрыть разницу между «контроллером устройства», введениедрайвер устройства.

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

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

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

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

Давайте посмотрим на поток обработки обработчика прерывания:

  1. Во время ввода-вывода, если контроллер устройства подготовил данные, он отправит запрос на прерывание в ЦП через контроллер прерываний;
  2. Защитить контекст ЦП прерванного процесса;
  3. Передача на соответствующий обработчик прерывания устройства;
  4. обработка прерываний;
  5. восстановить контекст прерванного процесса;

общий блочный слой

Для блочных устройств, чтобы уменьшить влияние различий в разных блочных устройствах, Linux использует унифицированныйобщий блочный слой, для управления различными блочными устройствами.

Общий блочный уровень — это уровень абстракции блочного устройства между файловой системой и диском, который выполняет две основные функции:

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

Память Linux поддерживает пять алгоритмов планирования ввода-вывода, а именно:

  • нет алгоритма планирования
  • Алгоритм планирования в порядке поступления
  • Полностью честный алгоритм планирования
  • приоритетное планирование
  • Алгоритмы планирования сроков

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

Второй — это алгоритм планирования «первым поступил — первым обслужен», который является простейшим алгоритмом планирования ввода-вывода.Запрос ввода-вывода, который первым поступает в очередь планирования ввода-вывода, выполняется первым.

Третий — полностью справедливый алгоритм планирования.Большинство систем используют этот алгоритм в качестве планировщика ввода/вывода по умолчанию.Он поддерживает очередь планирования ввода/вывода для каждого процесса и равномерно распределяет кванты времени каждого процесса.Запрос ввода/вывода.

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

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


Уровень программного обеспечения ввода-вывода системы хранения

Многое было упомянуто ранее, устройства, контроллеры устройств, драйверы и общие уровни блоков Теперь, в сочетании с принципом файловой системы, давайте посмотрим на уровни программного обеспечения ввода-вывода системы хранения Linux.

Ввод-вывод системы хранения Linux можно разделить на три уровня сверху вниз, а именно уровень файловой системы, уровень общих блоков и уровень устройств. Вся их иерархическая взаимосвязь такова:

Роли этих трех уровней:

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

Благодаря интерфейсу файловой системы вы можете не только управлять устройством через командную строку файловой системы, но и использовать прикладную программу для вызоваread,writeФункции управляют устройствами точно так же, как чтение и запись файлов, поэтому устройство — это просто специальный файл в Linux.

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

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

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

Что происходит во время набора букв на клавиатуре?

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

Давайте сначала посмотрим на схему аппаратной архитектуры процессора:

CPU 的硬件架构图

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

Затем, когда пользователь вводит символы с клавиатуры,контроллер клавиатурыДанные скан-кода будут сгенерированы и буферизированы в регистре контроллера клавиатуры, а затем контроллер клавиатуры отправит их в ЦП через шину.запрос на прерывание.

После того, как ЦП получит запрос на прерывание, операционная системаСохраните контекст ЦП прерванного процесса, затем вызовите клавиатуруобработчик прерывания.

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

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

После отображения результатов,восстановить контекст прерванного процесса.


Всем привет, я Сяолинь, специалист по инструментам, созданный специально для всех, увидимся в следующий раз!


Хорошая статья рекомендуется

Введите URL-адрес, и отобразится веб-страница. Что произошло за этот период?

Преимущества для читателей: 300 страниц иллюстрированных веб-файлов PDF упакованы для вас