¿Cómo accede CPU/DMA al disco duro?

¿Cómo accede CPU/DMA al disco duro?

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 nsectores 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/ outport 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 hdparmlos 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 clflushopto clwb.

información relacionada