Как процессор взаимодействует с периферийными устройствами? - PullRequest
26 голосов
/ 28 июля 2011

Я предполагаю, что процессор имеет прямой доступ к BIOS и оперативной памяти материнской платы. (Поправьте меня, если я не прав)

Но как процессор взаимодействует с другим оборудованием, таким как жесткие диски, платы расширения, периферийные устройства, другие BIOS и т. Д.?

Я знаю об ОС и ее драйверах, но они программные - они находятся в оперативной памяти. Как процессор взаимодействует со всем этим оборудованием на аппаратном уровне? Разве это не ограничивается только BIOS и оперативной памятью материнской платы?

Ответы [ 3 ]

39 голосов
/ 28 июля 2011

В старых архитектурах доступ к периферийным устройствам осуществлялся через отдельный механизм доступа к памяти со специальными инструкциями ввода / вывода. На x86 были (и есть!) Инструкции «in» и «out» для передачи байтов между процессором и периферийным устройством. Периферийным устройствам были даны адреса, например, 0x80 для клавиатуры. Упрощая многое, выполнение «в 0x80» будет считывать байт из контроллера клавиатуры в регистр процессора «AL».

В современных архитектурах доступ к периферийным устройствам осуществляется аналогично памяти: через сопоставленные адреса памяти на шине. Вы не должны думать о шине как о способе доступа к памяти. Это больше способ обратиться к отдельным периферийным устройствам, из которых память (RAM / DDR) - только один тип. Например, у вас может быть 2 ГБ ОЗУ по адресам 0x00000000..0x7fffffff. После этого у вас может быть видеокарта 0x80000000..0x80001fff. Контроллер шины (PCIe или любой другой) знает, какие диапазоны адресов идут на какое периферийное устройство.

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

Язык, с которым вы разговариваете с периферийными устройствами, в основном зависит от устройства. Общая тема заключается в том, что периферийное устройство отображается где-то в памяти (например, 0x80000000 для нескольких килобайт, как указано выше), с отдельным битом состояния и действиями, управляемыми разными словами (обычно 32 или 64 бита). Мифический пример последовательного порта в 0x80000000:

  • Записать 32-битное слово «A» в 0x80000000, поставив в очередь символ «A» в его выходном FIFO.
  • Записать 32-битное слово от 0x1 до 0x80000004, которое сообщает последовательному порту отправлять свою очередь.

Опять же, полностью составленный просто для примера, но настоящий последовательный порт (uart) не так уж и отличается.

Беда в том, что вы на самом деле не увидите любой из перечисленных выше схем памяти в современной ОС из-за виртуальной памяти. Указанные выше адреса будут называться «адресами физической памяти» (или адресами шины) - фактическими адресами, которые выходят на шину. CPU вместо этого видит адреса виртуальной памяти. Отдельные периферийные устройства должны быть сопоставлены с виртуальным адресным пространством. Это довольно сложно объяснить и, вероятно, лучше всего это сделать в другом Вопросе, но дело в том, что вы вряд ли получите доступ к периферийному устройству по его фактическому физическому адресу в современной ОС.

2 голосов
/ 30 марта 2018

Конечно, принятый ответ является точным, но, возможно, DrStrangeLove намеревался обратиться к чему-то другому или, по крайней мере, к этому вопросу относятся другие ответы.На самом деле, когда кто-то спрашивает: «Как периферия взаимодействует с процессором на аппаратном уровне?», Я думаю, что в ответе должна быть упомянута роль модулей ввода / вывода (например, адаптеров ввода / вывода, о которых все знают).Это важно подчеркнуть, потому что часть логики, требуемой для взаимодействия с устройствами ввода-вывода, встроена в модули ввода-вывода, что уменьшает потребность во внимании ЦП при выполнении операций ввода-вывода.Это звучит актуально для меня в контексте вопроса, потому что он спрашивает об аппаратных аспектах операций ввода-вывода, а адаптеры представляют собой аппаратные компоненты, которые абстрагируют сущности устройств ввода-вывода, скрывая их сложности от ЦП (ииз ОС тоже).Например, дисковые адаптеры скрывают аспекты геометрии дисков, освобождая CPU от запуска логики, необходимой для вращения пластин дисков, определения местоположения цилиндра и ожидания прохождения правильного сектора под головками чтения / записи.Аналогичные рассуждения применимы к другим устройствам, таким как видеоадаптеры, сетевые карты и так далее.Короче говоря, без модулей ввода / вывода задачи ввода / вывода будут перегружать процессор.Процитируем Stallings:

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

Кроме того, как правильно сказал Джон Рипли, существует пространство ввода / вывода, которое отображается в том же самоммода как оперативка есть.Действительно, периферийные устройства могут быть подключены непосредственно в адресное пространство памяти (которое известно как MMIO , Memory Mapped I / O) или в отдельное адресное пространство ( PMIO , Port-Mapped I / O, который также называется «изолированным I / O», потому что, в отличие от MMIO, адреса ввода-вывода полностью отделены от адресов оперативной памяти компьютера. Вот почему выДля связи с устройствами, использующими PMIO, необходимо использовать инструкции in и out .

В соответствии с вышеизложенным, MMIO и PMIO рассматривают устройства ввода-вывода как позиции памяти - в этом суть того, как аппаратное обеспечение обрабатывает операции ввода-вывода, но здесь необходимо упомянуть некоторые дополнительные подробности, чтобы получить богатую концептуальную основу нагрузка, вовлеченная в ввод / вывод. Поскольку каждый адаптер имеет ограниченный диапазон адресов, мы должны понимать, что такие позиции памяти работают как буферы данных, что означает, что у вас есть только несколько байтов («блоков данных») для одновременной связи с устройством. По этой причине обычно CPU не использует данные, которые он считывает непосредственно из этих позиций памяти: сначала данные считываются с устройства ввода-вывода по соответствующему адресу, затем эти данные сохраняются в ОЗУ и только тогда процессор может использовать его. Чтобы получить это, подумайте в большом двоичном файле, который должен выполнить процессор: у адаптера диска есть ограниченный буфер, ограниченный его адресным пространством ввода / вывода (обратите внимание, я не имею в виду внутренние буферы адаптера, но его адресное пространство, видимое ЦП), поэтому адаптер считывает некоторые данные с диска и предупреждает ЦП, когда буфер заполняется через прерывание; затем процессор прерывает все, что он делает, читает буфер, копирует содержимое буфера в ОЗУ и сигнализирует адаптеру, что он может продолжать выводить больше данных с диска. Этот цикл повторяется до тех пор, пока двоичный файл не будет полностью загружен в ОЗУ. С этого момента операция чтения объявляется завершенной, и файл может быть наконец выполнен.

Этот цикл называется ввод-вывод, управляемый прерываниями , и происходит полностью аппаратно (с некоторой поддержкой ОС для обработки прерываний), но, пожалуйста, обратите внимание, что есть еще две опции для выполнения ввода-вывода операции. Также возможно использовать так называемый PIO (программируемый ввод / вывод), где вместо использования механизма прерывания ЦП непрерывно объединяет контроллер в цикле, пока не будет собрана вся необходимая информация, блок за блоком (когда последний блок извлекается, цикл заканчивается). И ввод-вывод, управляемый прерываниями, и PIO тратят впустую процессорное время (особенно последнее) и давно были заменены прямым доступом к памяти (DMA), который позволяет устройству ввода-вывода записывать (или читать) свои данные непосредственно (или из) ОЗУ в соответствии с инструкциями процессора. Я считаю, что PIO полностью реализован в программном обеспечении из-за его пула, но я могу ошибаться на этом этапе. Я должен отметить, что, хотя DMA сделал PIO и управляемый прерываниями ввод / вывод устаревшими, я не уверен, что оба были запрещены в современных архитектурах.

0 голосов
/ 28 июля 2011

Это зависит от того, что вы подразумеваете под «прямым доступом».Ядро ЦП взаимодействует с основной памятью (ОЗУ) по шине .(Ядро может иметь более прямой доступ к относительно небольшим объемам памяти (кеш или регистры), но это другая проблема.) Процессор также связывается с периферийными устройствами через шины.Некоторые типы шин, о которых вы, возможно, слышали: универсальная последовательная шина (USB; обычно для внешних устройств), PCI, лицевая шина (тип шины, соединяющей ядра ЦП и основную память) или Serial-ATA (SATA; часто используетсядля устройств, таких как жесткие диски).

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

...