La mayoría de los sistemas en mi experiencia usan E/S mapeadas en memoria. La plataforma x86 tiene un espacio de direcciones de E/S no mapeadas en memoria (que usa la familia de códigos de operación del procesador in
/out
), pero la arquitectura de PC también utiliza ampliamente el espacio de direcciones de memoria estándar para E/S del dispositivo. que tiene un espacio de direcciones más grande, un acceso más rápido (generalmente) y una programación más sencilla (generalmente).
Creo que el espacio de direcciones de E/S por separado se usó inicialmente porque el espacio de direcciones de memoria de los procesadores a veces era bastante limitado y tenía poco sentido usar una parte para el acceso del dispositivo. Una vez que el espacio de direcciones de memoria se abrió a megabytes o más, esa razón para separar las direcciones de E/S de las direcciones de memoria se volvió menos importante.
No estoy seguro de cuántos procesadores proporcionan un espacio de direcciones de E/S por separado como lo hace el x86. Como una indicación de cómo el espacio de direcciones de E/S por separado ha caído en desgracia, cuando la arquitectura x86 se movió al reino de 32 bits, no se hizo nada para aumentar el espacio de direcciones de E/S de 64 KB (aunque agregaron la capacidad para mover fragmentos de datos de 32 bits en una instrucción). Cuando x86 se movió al 64-reino, el espacio de direcciones de E/S permaneció en 64 KB y ni siquiera agregaron la capacidad de mover datos en unidades de 64 bits ...
Tenga en cuenta también que las plataformas modernas de escritorio y servidor (u otros sistemas que usan memoria virtual) generalmente no permiten que una aplicación acceda a puertos de E/S, ya sea que estén mapeados en memoria o no. Ese acceso está restringido a los controladores de dispositivo, e incluso los controladores de dispositivo tendrán alguna interfaz de sistema operativo para tratar las asignaciones de memoria virtual de la dirección física y/o para configurar el acceso DMA.
En sistemas más pequeños, como sistemas integrados, la aplicación suele acceder directamente a las direcciones de E/S.Para los sistemas que usan direcciones mapeadas en memoria, esto generalmente se hará simplemente configurando un puntero con la dirección física del puerto de E/S del dispositivo y usando ese puntero como cualquier otro. Sin embargo, para garantizar que el acceso se produce y se produce en el orden correcto, el puntero debe declararse como apuntando a un objeto volatile
.
Para acceder a un dispositivo que utiliza algo distinto de un puerto de E/S mapeado en memoria (como el espacio de direcciones de E/S del x86), un compilador generalmente proporcionará una extensión que le permite leer o escribir en ese espacio de direcciones . En ausencia de dicha extensión, necesitaría llamar a una función de lenguaje ensamblador para realizar la E/S.
memoria asignada E/S? – Chubsdad
Solo para agregar a todas las respuestas, su plataforma x86 también hace esto (E/S de memoria asignada). Simplemente está acostumbrado a trabajar en un entorno protegido [1] creado por su sistema operativo, por lo que no tiene que (o por accidente puede) tocar todos los aspectos sucios del hardware real. Escriba un controlador, o mejor aún, un sistema operativo y tendrá que lidiar con la E/S de Memory Mapped mucho, entre una gran cantidad de otras cosas divertidas. :) [1] http://en.wikipedia.org/wiki/Protected_mode –
Ver http://stackoverflow.com/questions/15371953/memory-mapped-io-vs-port-mapped-io – Pacerier