Я немного не понимаю различий между DMA и прерыванием ввода-вывода.
Различия между DMA и прерываниями надуманы, потому что они не являются противоположными понятиями.
DMA и прерывания — ортогональные понятия, и оба понятия обычно используются вместе.
Альтернативой DMA является программируемый ввод/вывод, также известный как PIO.
Альтернативой прерываниям является опрос.
Управляемый прерываниями
Вам нужно уточнить, что вы имеете в виду.
Если система не использует прерывания, то ей придется использовать опрос для обнаружения изменения состояния устройства.
PIO часто использует прерывание (от устройства) для инициации передачи каждого байта/слова данных. Это помогает смягчить характер PIO, интенсивно использующий ЦП. В противном случае передача PIO по запросу полностью потребляла бы ресурсы ЦП.
Но называть PIO с прерываниями просто прерываниями или управляемыми прерываниями неточно и вводит в заблуждение.
Передачи DMA почти всегда используют completion interrupt
(от контроллера DMA) для уведомления ЦП о завершении передачи буфера.
Опрос завершения DMA (вместо использования прерывания завершения) нагружает ЦП, который должно облегчить. Я видел загрузчик, который инициировал передачу DMA, а затем опрашивал для завершения. Но это среда с одной задачей, которая может позволить себе активное ожидание, в то время как операционной системе необходимо максимизировать доступность ЦП. Это означает использование прямого доступа к памяти с прерываниями завершения.
Обсуждение прерываний без предоставления конкретного контекста, например. источник и причина, по которой генерируются эти прерывания, вероятно, ответственны за ваше замешательство.
- Инициализация контроллера через драйвер
- Контроллер проверяет регистры, загруженные драйвером, чтобы принять решение о действии.
- Происходит передача данных с/на периферию и буфер контроллера.
- Контроллер выдает прерывание, когда (при каждом прочитанном байте? при каждом прочитанном слове? при заполнении буфера? при завершении передачи?
- Насколько я понимаю, ЦП ничего не делает, пока выполняется ввод-вывод периферийного контроллера ‹-› и выполняется ввод-вывод контроллера ‹-› MM?
- Когда передача завершена или когда блок заполнен, ЦП должен инициализировать передачу из буфера контроллера в ММ.
Проблема, которую я вижу в ваших вопросах, заключается в том, что вы представляете неоднозначную конфигурацию.
Вы упоминаете периферийное устройство, контроллер, ЦП и ММ (возможно, основную память?).
С точки зрения программного обеспечения периферийное соединение может быть одной из следующих топологий:
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.
прямой доступ к памяти
То же, что и выше, за исключением того, что контроллер может передавать данные из своего буфера напрямую в ММ без вмешательства процессора.
Означает ли это, что процессор прерывается только тогда, когда вся передача завершена, или он все еще прерывается, когда буфер контроллера заполняется?
Единственная разница в том, что ЦП больше не должен ждать контроллера ‹-› MM I/O, но все еще должен прерываться, когда буфер контроллера заполняется? Или DMA скрывает это и от процессора?
Эти сценарии и вопросы едва ли имеют смысл. Направление передачи не указано, т. е. выполняет ли ЦП операцию чтения или записи).
Передачи DMA почти всегда используют completion interrupt
(от контроллера DMA) для уведомления ЦП о завершении передачи буфера.
Вы постоянно используете фразу когда буфер контроллера заполняется, не указывая источник этих данных. Если вы спрашиваете о вводе-выводе «устройство-контроллер», то такой ввод-вывод, как правило, не вызывает особого беспокойства для ЦП, а индикация состояния зависит от контроллера.
Вы, кажется, спрашиваете о блочном переводе. Понимание передачи блоков не обязательно дает понимание символьного ввода-вывода. /38119491/master-for-interrupt-based-uart-io/38155310#38155310">Мастер для ввода/вывода UART на основе прерываний
person
sawdust
schedule
02.07.2016