Архитектура компьютера

Системы ввода-вывода: DMA и прерывания

Ваш SSD читает 7 GB/s. Диск работает, CPU работает - но кто на самом деле копирует данные? Если CPU, он тратит 100% на простое перекладывание байт. DMA решил эту проблему ещё в 1970-х.

  • NVMe SSD с DMA освобождает CPU для вычислений
  • GPU zero-copy transfer через DMA (без CPU)
  • Сетевой стек Linux: NAPI + DMA = 100Gbps без загрузки CPU
  • IOMMU защита в виртуализации (Thunderbolt DMA атаки)

Три стратегии I/O

**Проблема:** Диск работает в 100 000 раз медленнее CPU. Как не тратить такты на ожидание? Три решения: Polling (опрос), Interrupts (прерывания), DMA (прямой доступ к памяти).

СтратегияCPU занятостьЗадержкаПрименение
Polling100%МинимальнаяБыстрые устройства, real-time
InterruptsТолько обработкаМалаяКлавиатура, сеть
DMAТолько setupСредняяДиск, GPU, сеть

**Polling не всегда плохо:** Высокоскоростные NVMe SSD используют polling (busy-wait) для минимизации задержки. Прерывание имеет overhead ~1-2 мкс, а NVMe отвечает за 70 мкс.

Почему для высокоскоростного NVMe диска иногда используют polling вместо прерываний?

Механизм прерываний

**Прерывание** - аппаратный сигнал, заставляющий CPU приостановить текущую задачу и выполнить ISR (Interrupt Service Routine). Это ключевой механизм реактивных систем.

**Interrupt Storm:** Если устройство посылает тысячи прерываний/сек, CPU тратит всё время на ISR. Решение - interrupt coalescing: группировать несколько событий в одно прерывание (сеть: NAPI в Linux).

Почему ISR должна быть максимально короткой?

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

**DMA-контроллер** - специализированный процессор, который копирует данные между устройством и RAM без участия CPU. CPU только программирует передачу.

**IOMMU:** В современных системах DMA проходит через IOMMU (I/O Memory Management Unit), который защищает память. Злонамеренное устройство не может прочитать произвольную память хоста - critical для виртуализации и безопасности.

DMA - это способ ускорить I/O, ничего больше. CPU освобождается на время передачи и спокойно занимается другой работой.

DMA освобождает CPU, но создаёт два новых класса проблем: cache coherency (DMA пишет в RAM мимо кэшей CPU) и безопасность (вредоносное устройство может прочитать любую память без IOMMU). Современные системы используют IOMMU именно для изоляции DMA-устройств.

Интуиция «асинхронность = выигрыш» забывает про когерентность. На x86 DMA-запись инвалидирует cache lines через snooping; на ARM это явные barriers и cache management в драйвере. Без IOMMU PCIe-устройство (видеокарта, NIC) может через DMA прочитать ключи шифрования из памяти ядра - это реальный класс атак (Thunderspy, DMA evil maid).

Какова роль IOMMU при DMA?

Ключевые идеи

  • Polling: CPU ждёт устройство - 100% загрузка, минимальная задержка
  • Interrupts: CPU прерывается по сигналу - эффективно для редких событий
  • DMA: независимый контроллер копирует данные, CPU только настраивает
  • ISR должна быть быстрой - разбивать на top/bottom halves
  • IOMMU защищает память от DMA-атак через устройства

Связанные темы

I/O системы тесно связаны с виртуальной памятью и иерархией памяти.

  • Виртуальная память — IOMMU - аналог MMU для устройств
  • Кэш и когерентность — DMA обходит кэш - нужна инвалидация

Вопросы для размышления

  • Почему DMA-буфер должен быть физически непрерывным? Как Scatter-Gather DMA решает эту проблему?
  • Что произойдёт если ISR будет читать данные из медленного SPI Flash? Почему это опасно?
  • Как IOMMU защищает систему от атак через Thunderbolt-устройство?

Связанные уроки

  • arch-08-memory-hierarchy — Memory hierarchy задаёт контекст: DMA перемещает данные по той же иерархии
  • arch-06-pipelining — Прерывания нарушают пайплайн - нужно понимать hazards
  • arch-14-multicore — Многоядерность требует понимания I/O latency и NUMA-топологии
  • ds-16-graphs-intro — Шина PCI-Express - это граф: topology matters для bandwidth
  • os-01-intro
Системы ввода-вывода: DMA и прерывания

0

1

Войти