Как cpu взаимодействует с периферийными устройствами?

Я предполагаю, что cpu имеет прямой доступ к BIOS и ОЗУ материнской платы.(поправьте меня, если я ошибаюсь)

но как cpu взаимодействует с другим оборудованием, таким как жесткие диски, карты расширения, периферийные устройства, другие BIOSes и т. д.?

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

3 ответов


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

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

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

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

  • запись 32 битное слово в 0x80000000, то очереди символ 'A' в его выходной ФИФО.
  • напишите 32-битное слово 0x1 в 0x80000004, которое сообщает последовательному порту отправить свою очередь.

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

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


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

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

кроме того, как правильно заявил Джон Рипли, существует пространство ввода-вывода, которое отображается таким же образом, как и ОЗУ. В самом деле, периферия может быть нанесена на карту!--7-->напрямую в память адресное пространство (которое известно как MMIO, memory Mapped I / O), или в разделенные адрес места (PMIO, порт-сопоставленный ввод-вывод, который также называется "изолированный ввод-вывод", потому что, в отличие от MMIO, адреса ввода-вывода полностью отделены от адресов ОЗУ компьютера. Вот почему вы должны использовать на и из инструкции для связи с устройствами, использующими PMIO).

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

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


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

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