18. 5.17: Что такое MMIO и где оно живёт в SoC
18.1. Обзор
MMIO (Memory-Mapped I/O) — это механизм, при котором регистры периферийных устройств (например, GPIO, UART, SPI) отображаются в адресное пространство памяти процессора.
Важно понимать, что MMIO — это не «виртуальная» память, а реально существующие физические регистры, размещённые внутри кристалла SoC (System-on-Chip).
MMIO ≠ RAM ≠ ROM. Это логические блоки, чувствительные к доступу по конкретным адресам.
18.2. MMIO в Raspberry Pi 3
На Raspberry Pi 3 используется SoC Broadcom BCM2835/2836/2837.
Пример: GPIO-контроллер BCM2835 доступен по адресу:
Физический адрес: 0x3F200000 (RPi 3)
Размер: 0xB4 байт (примерно 180 байт)
Контроллер GPIO реализует:
конфигурацию направления (вход/выход),
чтение/установку значения,
альтернативные функции.
Регистры, такие как GPSET0, GPCLR0, GPLEV0, имеют фиксированные смещения от этого адреса.
18.3. Взаимодействие с MMIO
В ядре Linux драйвер делает следующее:
`ioremap()` — отображает физический адрес MMIO в виртуальное пространство ядра:
gpio_base = ioremap(0x3F200000, 0xB4);
`writel()` и `readl()` используются для записи и чтения значений:
writel(1 << 26, gpio_base + GPSET0); // установить пин 26 writel(1 << 26, gpio_base + GPCLR0); // сбросить пин 26
Эти обращения фактически активируют логические блоки внутри SoC.
18.4. Архитектура взаимодействия
[CPU ARM Cortex-A53]
|
[System Bus / AMBA]
|
[GPIO Controller @ 0x3F200000]
|
[GPIO Pin 26 on Header]
Когда writel(1 << 26, …) записывает по адресу 0x3F20001C, контроллер GPIO в SoC реагирует, устанавливая напряжение на выводе GPIO26 (3.3V или GND).
📌 Ни один байт в RAM или ROM при этом не затрагивается.
18.5. MMIO vs RAM vs ROM
Область |
Что хранит |
|---|---|
MMIO |
Регистры устройств (управление периферией) |
RAM (ОЗУ) |
Временные данные, память процессов |
ROM (ПЗУ) |
Загрузчик, прошивка |
18.6. Вывод
MMIO регистры реально существуют в кремнии SoC.
Они не являются частью RAM.
Любой доступ к MMIO = доступ к физическим компонентам устройства.
На примере rgb_led_mmio.ko мы видим, как MMIO позволяет управлять светодиодами напрямую, минуя GPIO API.
Следующий шаг — использование MMIO и Device Tree вместе для гибридного управления.