dma против ввода-вывода, управляемого прерываниями

Я немного не понимаю различий между DMA и вводом-выводом с прерыванием. (В настоящее время читает «Концепции операционных систем», 7-е изд.).

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

Управляемый прерываниями

  1. Инициализация контроллера через драйвер
  2. Контроллер проверяет регистры, загруженные драйвером, чтобы принять решение о действии.
  3. Происходит передача данных с/на периферию и буфер контроллера.
  4. Контроллер выдает прерывание, когда (при каждом прочитанном байте? при каждом прочитанном слове? при заполнении буфера? при завершении передачи?
  5. Насколько я понимаю, ЦП ничего не делает, пока выполняется как периферийный ‹-> ввод-вывод контроллера, так и контроллер ‹-> MM I/O?
  6. Когда передача завершена или когда блок заполнен, ЦП должен инициализировать передачу из буфера контроллера в ММ.

DMA

  1. То же, что и выше, за исключением того, что контроллер может передавать данные из своего буфера напрямую в ММ без вмешательства процессора.
  2. Означает ли это, что процессор прерывается только тогда, когда вся передача завершена, или он все еще прерывается, когда буфер контроллера заполняется?
  3. Единственная разница в том, что ЦП больше не должен ждать контроллера ‹-> MM I/O, а должен прерываться при заполнении буфера контроллера? Или DMA скрывает это и от процессора?

person Joney    schedule 14.08.2014    source источник


Ответы (3)


Я немного не понимаю различий между DMA и прерыванием ввода-вывода.

Различия между DMA и прерываниями надуманы, потому что они не являются противоположными понятиями.
DMA и прерывания — ортогональные понятия, и оба понятия обычно используются вместе.

Альтернативой DMA является программируемый ввод/вывод, также известный как PIO.
Альтернативой прерываниям является опрос.

Управляемый прерываниями

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

PIO часто использует прерывание (от устройства) для инициации передачи каждого байта/слова данных. Это помогает смягчить характер PIO, интенсивно использующий ЦП. В противном случае передача PIO по запросу полностью потребляла бы ресурсы ЦП.
Но называть PIO с прерываниями просто прерываниями или управляемыми прерываниями неточно и вводит в заблуждение.

Передачи DMA почти всегда используют completion interrupt (от контроллера DMA) для уведомления ЦП о завершении передачи буфера.
Опрос завершения DMA (вместо использования прерывания завершения) нагружает ЦП, который должно облегчить. Я видел загрузчик, который инициировал передачу DMA, а затем опрашивал для завершения. Но это среда с одной задачей, которая может позволить себе активное ожидание, в то время как операционной системе необходимо максимизировать доступность ЦП. Это означает использование прямого доступа к памяти с прерываниями завершения.

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

  1. Инициализация контроллера через драйвер
  2. Контроллер проверяет регистры, загруженные драйвером, чтобы принять решение о действии.
  3. Происходит передача данных с/на периферию и буфер контроллера.
  4. Контроллер выдает прерывание, когда (при каждом прочитанном байте? при каждом прочитанном слове? при заполнении буфера? при завершении передачи?
  5. Насколько я понимаю, ЦП ничего не делает, пока выполняется ввод-вывод периферийного контроллера ‹-› и выполняется ввод-вывод контроллера ‹-› MM?
  6. Когда передача завершена или когда блок заполнен, ЦП должен инициализировать передачу из буфера контроллера в ММ.

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

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

A. ЦП ‹--› устройство

B. Контроллер ЦП ‹--› -- [устройство или носитель]

C. Шина ЦП ‹--› -- устройство
D. Шина ЦП ‹--› -- контроллер -- [устройство или среда]

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

Соединение B типизирует устройство, которое взаимодействует с ЦП через контроллер устройства, например. Контроллер MultiMediaCard (MMC) для SDcard и дисковода IDE (интегрированный контроллер диска). В отличие от A, ЦП должен взаимодействовать только с контроллером устройства, а не с самим устройством. Взаимодействие между контроллером и его устройством обычно не контролируется ЦП и минимально контролируется (если вообще контролируется). Контроллер существует для упрощения интерфейса между ЦП и его устройством.

Соединения C и D типизируют устройство или его контроллер, к которому ЦП может обращаться косвенно через шину (например, USB, SPI или SATA), например адаптер USB-Ethernet или флэш-память SPI NOR. Команду устройству или его контроллеру нужно передавать по шине. Например, команды ATAPI на контроллер диска должны передаваться через контроллер SATA. В отличие от A, контроллер шины — это интерфейс, через который ЦП должен непосредственно выполнять ввод-вывод.

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

прямой доступ к памяти

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

  2. Означает ли это, что процессор прерывается только тогда, когда вся передача завершена, или он все еще прерывается, когда буфер контроллера заполняется?

  3. Единственная разница в том, что ЦП больше не должен ждать контроллера ‹-› MM I/O, но все еще должен прерываться, когда буфер контроллера заполняется? Или DMA скрывает это и от процессора?

Эти сценарии и вопросы едва ли имеют смысл. Направление передачи не указано, т. е. выполняет ли ЦП операцию чтения или записи).

Передачи DMA почти всегда используют completion interrupt (от контроллера DMA) для уведомления ЦП о завершении передачи буфера.

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

Вы, кажется, спрашиваете о блочном переводе. Понимание передачи блоков не обязательно дает понимание символьного ввода-вывода. /38119491/master-for-interrupt-based-uart-io/38155310#38155310">Мастер для ввода/вывода UART на основе прерываний

person sawdust    schedule 02.07.2016

В случае ввода-вывода, управляемого прерыванием, MCU получает прерывание по каждому байту или слову, в зависимости от того, что облегчает микроконтроллер. MCU переходит в режим прерывания, оставляя нормальный режим работы для каждого приема байта/слова. Здесь MCU ничего не может сделать, кроме как читать данные из IO и копировать в память.

В случае DMA DMA делает то же самое, что и MCU в случае прерывания. Так что здесь MCU может делать что угодно. Вы можете настроить DMA на то, сколько байтов вам нужно прерывать. Так что здесь это отличается от прерывания ввода-вывода, потому что MCU не получает прерывание для каждого байта или слова; вместо этого получайте прерывание от DMA только тогда, когда он получил объем данных, который вы настроили. Кроме того, DMA скопировал данные из ввода-вывода в ОЗУ, поэтому MCU также не нужно прилагать усилий для копирования, что значительно экономит время.

Таким образом, если вы настроили DMA для прерывания на 1 КБ данных, ваш MCU получит 1 прерывание для 1 КБ, в противном случае он получит 1 КБ прерываний, если использует ввод-вывод, управляемый прерываниями. Таким образом, использование DMA уменьшает количество прерываний и повышает производительность по сравнению с вводом-выводом, управляемым прерываниями.

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

person Vicky    schedule 20.08.2014
comment
Таким образом, во время передачи периферийного контроллера ‹-› ЦП по-прежнему свободен для выполнения другой работы ... но он будет прерываться при каждом переданном байте / слове (возможно, для передачи буфера контроллеров через ЦП, а затем в MM)? - person Joney; 24.08.2014
comment
да. Я могу привести вам другой пример. Есть два контроллера. Один в ведущем, а другой в ведомом режиме. Теперь, если мастер хочет прочитать некоторые данные из вспомогательной памяти (ОЗУ), вы можете настроить DMA на ведомом устройстве. DMA может предоставить данные ОЗУ для управления по запросу. Это уменьшает участие ведомого устройства в передаче данных. Это очень помогает в системе, где требуется высокая производительность и пропускная способность. Я думаю, что этот пример проясняет ситуацию. - person Vicky; 01.09.2014

Позвольте мне выразить это простыми словами для вашего понимания.

DMA, что означает прямой доступ к памяти, представляет собой систему, в которой аппаратный компонент компьютера получает доступ к шине памяти и управляет передачей. Скажем, привод CD/DVD обычно работает с использованием прямого доступа к памяти. Но помните, что ЦП всегда является МАСТЕРОМ всего, это означает, что даже если ЦП передал контроллеру DMA главенство, он все еще имеет право проверять DMA. Он может повторно вызвать управление шиной в любое время, когда захочет, он может даже выполнить задачу прямого доступа к памяти. Существуют регистры, которые используются для установки управления шиной от ЦП к DMA и от DMA к ЦП. Как только DMA-контроллер закончит свою работу, он может прервать или сообщить ЦП, что он завершил свою работу. Это про ДМА.

Теперь перейдем к прерыванию ввода/вывода. Прерывание ввода-вывода происходит намного чаще, чем DMA. Процесс обычно подвергается вводу-выводу много раз. Запрос ввода от пользователя будет прерыванием ввода-вывода. Не ДМА. Есть два типа прерываний.

  1. Программное прерывание
  2. Аппаратное прерывание

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

person user3815757    schedule 04.11.2014