Архитектура компьютера
Системы ввода-вывода: 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 занятость | Задержка | Применение |
|---|---|---|---|
| Polling | 100% | Минимальная | Быстрые устройства, 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