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 драйвер делает следующее:

  1. `ioremap()` — отображает физический адрес MMIO в виртуальное пространство ядра:

    gpio_base = ioremap(0x3F200000, 0xB4);
    
  2. `writel()` и `readl()` используются для записи и чтения значений:

    writel(1 << 26, gpio_base + GPSET0);  // установить пин 26
    writel(1 << 26, gpio_base + GPCLR0);  // сбросить пин 26
    
  3. Эти обращения фактически активируют логические блоки внутри 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 вместе для гибридного управления.