La E/S mapeada en memoria significa que los registros del dispositivo se asignan al espacio de memoria de la máquina:cuando la CPU lee o escribe esas regiones de memoria, está leyendo o escribiendo en el dispositivo, en lugar de la memoria real. Para transferir datos del dispositivo a un búfer de memoria real, la CPU tiene que leer los datos de los registros del dispositivo asignados a la memoria y escribirlos en el búfer (y viceversa para transferir datos al dispositivo).
Con una transferencia DMA, el dispositivo puede transferir datos directamente hacia o desde un búfer de memoria real. La CPU le dice al dispositivo la ubicación del búfer y luego puede realizar otro trabajo mientras el dispositivo accede directamente a la memoria.
Dado que otros ya han respondido la pregunta, agregaré un poco de historia.
En los viejos tiempos, en el hardware x86 (PC), solo había espacio de E/S y espacio de memoria. Se trataba de dos espacios de direcciones diferentes, a los que se accedía con un protocolo de bus diferente y con instrucciones de CPU diferentes, pero capaces de comunicarse a través de la misma ranura de tarjeta enchufable.
La mayoría de los dispositivos usaban espacio de E/S tanto para la interfaz de control como para la interfaz de transferencia de datos masivos. La forma sencilla de acceder a los datos era ejecutar muchas instrucciones de la CPU para transferir datos una palabra a la vez desde una dirección de E/S a una dirección de memoria (a veces conocido como "golpe de bits").
Para mover los datos de los dispositivos a la memoria del host de forma autónoma, no había soporte en el protocolo de bus ISA para que los dispositivos iniciaran transferencias. Se inventó una solución de compromiso:el controlador DMA. Esta era una pieza de hardware que se instalaba junto a la CPU e iniciaba transferencias para mover datos desde la dirección de E/S de un dispositivo a la memoria, o viceversa. Debido a que la dirección de E/S es la misma, el controlador DMA está haciendo exactamente las mismas operaciones que haría una CPU, pero un poco más eficiente y permitiendo cierta libertad para seguir ejecutándose en segundo plano (aunque posiblemente no por mucho tiempo, ya que no puede hablar con la memoria).
Avance rápido a los días de PCI, y los protocolos de bus se volvieron mucho más inteligentes:cualquier dispositivo puede iniciar una transferencia. Por lo tanto, es posible que, digamos, una tarjeta controladora RAID mueva los datos que desee hacia o desde el host en el momento que desee. Esto se llama modo "maestro de bus", pero sin ninguna razón en particular, la gente continúa refiriéndose a este modo como "DMA" a pesar de que el antiguo controlador DMA ya no existe. A diferencia de las antiguas transferencias DMA, con frecuencia no hay ninguna dirección de E/S correspondiente, y el modo maestro del bus suele ser la única interfaz presente en el dispositivo, sin ningún modo de "golpe de bits" de la CPU.
La E/S mapeada en memoria permite que la CPU controle el hardware leyendo y escribiendo direcciones de memoria específicas. Por lo general, esto se usaría para operaciones de bajo ancho de banda, como cambiar bits de control.
DMA permite que el hardware lea y escriba directamente la memoria sin involucrando a la CPU. Por lo general, esto se usaría para operaciones de gran ancho de banda, como E/S de disco o entrada de video de cámara.
Aquí hay un documento que tiene una comparación exhaustiva entre MMIO y DMA.
Directrices de diseño para sistemas RDMA de alto rendimiento
El acceso directo a la memoria (DMA) es una técnica para transferir los datos de E/S a la memoria y de la memoria a la E/S sin la intervención de la CPU. Para ello, se utiliza un chip especial, denominado controlador DMA, para controlar todas las actividades y la sincronización de datos. Como resultado, en comparación con otras técnicas de transferencia de datos, DMA es mucho más rápido.
Por otro lado, la memoria virtual actúa como un caché entre la memoria principal y la memoria secundaria. Los datos se obtienen por adelantado de la memoria secundaria (disco duro) a la memoria principal para que los datos ya estén disponibles en la memoria principal cuando se necesiten. Nos permite ejecutar más aplicaciones en el sistema de las que tenemos suficiente memoria física para soportar.