Рассматриваем процессор 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
.