Как CPU/DMA получает доступ к жесткому диску?

Как CPU/DMA получает доступ к жесткому диску?

Рассматриваем процессор x86/LINUX

Я хочу понять, как процессор или DMA получают доступ к жесткому диску? Должен ли жесткий диск быть доступен через адреса портов ввода-вывода или он должен быть отображен в памяти (MMIO)?

решение1

Данные на жестком диске не являются частью физического адресного пространства . 1данныене отображается в памяти.

Контроллер SATA (например) имеет регистры ввода-вывода, в которые процессору необходимо записывать данные, чтобы запрограммировать его на выполнение DMA-передачи nсекторов с определенного смещения диска на определенный адрес физической памяти.

Некоторые или все эти регистры ввода-вывода могут быть доступны через MMIO (обычные загрузки и сохранения по специальным адресам), а не inчерез outпорт ввода-вывода. Но это все еще просто вопрос отправки нужных команд контроллеру SATA. (Подробнее см.https://wiki.osdev.org/AHCI.) AHCI — наиболее широко используемый тип интерфейса ядро ​​<-> аппаратный драйвер, но существуют и другие (например, сложные RAID-контроллеры, которым нужны собственные драйверы).

например, контроллер AHCI SATA на моей материнской плате, согласно lspci -v:

00:17.0 SATA controller: Intel Corporation Q170/Q150/B150/H170/H110/Z170/CM236 Chipset SATA Controller [AHCI Mode] (rev 31) (prog-if 01 [AHCI 1.0])
        Subsystem: ASUSTeK Computer Inc. Q170/Q150/B150/H170/H110/Z170/CM236 Chipset SATA Controller [AHCI Mode]
        Flags: bus master, 66MHz, medium devsel, latency 0, IRQ 135
        Memory at f7248000 (32-bit, non-prefetchable) [size=8K]
        Memory at f724c000 (32-bit, non-prefetchable) [size=256]
        I/O ports at f090 [size=8]
        I/O ports at f080 [size=4]
        I/O ports at f060 [size=32]
        Memory at f724b000 (32-bit, non-prefetchable) [size=2K]
        Capabilities: <access denied>
        Kernel driver in use: ahci
        Kernel modules: ahci

Эти два небольших региона "памяти" (2k и 8k) почти наверняка являются портами MMIO, но у него также есть несколько портов ввода-вывода в адресном пространстве ввода-вывода. "Непредварительно извлекаемый" — это намек; если чтения имеют побочный эффект, предварительная выборка должна быть отключена.

Обратите внимание на flags: bus master. Это означает, что он может осуществлять прямой доступ к основной памяти и из нее.

Но мой NVMe SSDтолькоимеет пространство MMIO, нет устаревших портов ввода-вывода.

03:00.0 Non-Volatile memory controller: Intel Corporation SSD 600P Series (rev 03) (prog-if 02 [NVM Express])
        Subsystem: Intel Corporation SSD 600P Series
        Flags: bus master, fast devsel, latency 0, IRQ 16, NUMA node 0
        Memory at f7000000 (64-bit, non-prefetchable) [size=16K]
        Capabilities: <access denied>
        Kernel driver in use: nvme

Современные контроллеры жестких дисков не заставляют ЦП копировать данные по 4 или 8 байт за раз с помощью "программируемого ввода-вывода". Это была возможность с классическими контроллерами IDE / ATA, но только как запасной вариант на случай, если что-то пойдет не так (например, зависание или повреждение данных) на вашей материнской плате или контроллере PCI HD при использовании hdparmдля настройки драйверов Linux на использование DMA-передачи в системах до SATA.

Технически PIO по-прежнему является опцией для контроллеров AHCI SATA, судя по всему. Но он никогда не является опцией по умолчанию; в отличие от старых недобрых времен, когда поломка оборудования была реальной возможностью, современные ОС могут спокойно ожидать, что DMA будет работать правильно.


Сноска 1: если только ваш «жесткий диск» на самом деле неэнергонезависимая DIMMв слоте памяти, напримерIntel Optane DC PM, или DRAM с батарейным питанием). Передача недавно сохраненных данных из кэшей ЦП с обратной записью в энергонезависимое хранилище, отображаемое в памяти, является одним из вариантов использования таких инструкций, как clflushoptили clwb.

Связанный контент