Considerando CPU x86/LINUX
Quiero entender cómo accede la CPU o el dma al disco duro. ¿Se debe acceder al disco duro a través de direcciones de puerto IO o debe asignarse a la memoria (MMIO)?
Respuesta1
Los datos del disco duro no forman parte del espacio de direcciones físicas. 1 Eldatosno está mapeado en memoria.
El controlador SATA (por ejemplo) tiene registros de E/S en los que la CPU necesita escribir para programarlo para realizar una transferencia DMA de n
sectores desde un determinado desplazamiento de disco a una determinada dirección de memoria física.
Es posible que se pueda acceder a algunos o todos estos registros de E/S a través de MMIO (cargas y almacenes normales en direcciones especiales) en lugar de in
/ out
port IO. Pero todavía es sólo cuestión de enviar los comandos deseados al controlador SATA. (Para más detalles al respecto, consultehttps://wiki.osdev.org/AHCI.) AHCI es el tipo más utilizado de interfaz de controlador de hardware kernel <->, pero existen otros (por ejemplo, controladores RAID sofisticados que necesitan sus propios controladores).
por ejemplo, el controlador AHCI SATA en mi mobo, de acuerdo con 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
Es casi seguro que esas dos pequeñas regiones de "memoria" (2k y 8k) son puertos MMIO, pero también tienen algunos puertos de E/S en el espacio de direcciones de E/S. El "no precargable" es una pista; Si las lecturas tienen un efecto secundario, la captación previa debe estar deshabilitada.
Nota la flags: bus master
. Eso significa que puede realizar DMA hacia/desde la memoria principal.
Pero mi SSD NVMesolotiene espacio MMIO, sin puertos de E/S heredados.
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
Los controladores de disco duro modernos no hacen que la CPU copie los datos 4 u 8 bytes a la vez con "E/S programadas". Esa era una opción con los controladores IDE/ATA clásicos, pero solo como alternativa en caso de que sucediera algo malo (como bloqueos o corrupción de datos) en su placa base o controlador PCI HD al configurar hdparm
los controladores de Linux para usar transferencias DMA en pre-SATA. sistemas.
Técnicamente, aparentemente PIO sigue siendo una opción para los controladores AHCI SATA. Pero nunca es lo predeterminado; A diferencia de los viejos tiempos, cuando el hardware roto era una posibilidad real, los sistemas operativos modernos pueden esperar con seguridad que DMA funcione correctamente.
Nota al pie 1: a menos que su "disco duro" sea en realidad unDIMM no volátilen una ranura de memoria, comoIntel® Optane® DC PM, o una DRAM respaldada por batería). Obtener datos almacenados recientemente desde cachés de CPU con reescritura a un almacenamiento asignado en memoria no volátil es un caso de uso para instrucciones como clflushopt
o clwb
.