Entrada/Salida (E/S) Mapeada y No Mapeada en Memoria: Funcionamiento y Ejemplos en ARM
Enviado por Chuletator online y clasificado en Informática y Telecomunicaciones
Escrito el en español con un tamaño de 6,73 KB
Entrada/Salida (E/S) Mapeada y No Mapeada en Memoria
En los sistemas computacionales, la comunicación entre la unidad central de procesamiento (CPU) y los dispositivos periféricos se realiza a través de mecanismos de Entrada/Salida (E/S). Existen dos enfoques principales para gestionar esta comunicación: la E/S mapeada en memoria y la E/S no mapeada en memoria (también conocida como E/S aislada o independiente).
E/S Mapeada en Memoria
En la E/S mapeada en memoria, se comparte el espacio de direcciones de memoria entre la memoria principal y los registros de los dispositivos de E/S. Esto significa que existe un único espacio de direcciones, y tanto las celdas de memoria como los registros de los periféricos se acceden utilizando las mismas instrucciones (por ejemplo, load
y store
en ensamblador).
- Ventajas:
- Se pueden utilizar las mismas instrucciones de acceso a memoria para acceder a los registros de E/S.
- No se requieren instrucciones especiales de E/S.
- Se puede utilizar cualquier tipo de direccionamiento disponible para la memoria.
- Se pueden mapear tantos registros como direcciones de memoria haya disponibles.
- Desventajas:
- Se reduce el espacio de direcciones disponible para la memoria principal.
- Se requiere un mecanismo para proteger los registros de E/S del acceso no autorizado por parte de programas de usuario (normalmente gestionado por el sistema operativo).
E/S No Mapeada en Memoria (E/S Aislada)
En la E/S no mapeada en memoria, existen espacios de direcciones separados para la memoria principal y los dispositivos de E/S. Esto implica que se utilizan instrucciones diferentes para acceder a la memoria y a los registros de los periféricos. A menudo, se emplean instrucciones específicas como IN
y OUT
para la E/S.
- Ventajas:
- No se reduce el espacio de direcciones de la memoria principal.
- Es más fácil controlar el acceso a los registros de E/S, ya que se requieren instrucciones específicas.
- Desventajas:
- Se necesitan instrucciones especiales de E/S (como
IN
yOUT
), lo que puede complicar la lógica del procesador. - El número de registros de E/S que se pueden direccionar suele ser limitado.
- Se pueden requerir señales de control adicionales en el bus del sistema para distinguir entre accesos a memoria y accesos a E/S.
- Se necesitan instrucciones especiales de E/S (como
Registros Mapeados vs. No Mapeados
La diferencia clave radica en cómo se accede a los registros del controlador del dispositivo:
- Registros Mapeados: Los registros del controlador tienen direcciones asignadas dentro del espacio de direcciones de memoria. Se leen y escriben como si fueran ubicaciones de memoria normales.
- Registros No Mapeados: Los registros del controlador se acceden a través de instrucciones de E/S específicas (
IN
,OUT
) y puertos de E/S.
Ejemplo de Lectura de Datos (Mapeado vs. No Mapeado)
Mapeado en memoria (ejemplo en ensamblador ARM):
ldr r0, =0xE0028000 ; Dirección base del periférico
ldr r1, [r0] ; Lee el dato del registro en la dirección 0xE0028000
No mapeado en memoria (ejemplo hipotético):
in r1, [0x0300] ; Lee el dato del puerto de E/S 0x0300 en el registro r1
En el ejemplo mapeado, se usa ldr
(load), una instrucción de acceso a memoria. En el no mapeado, se usa in
, una instrucción específica de E/S.
E/S en ARM
En la arquitectura ARM, los periféricos de E/S típicamente se mapean en memoria. Esto significa que se accede a los registros de los periféricos como si fueran ubicaciones de memoria. Además, ARM soporta interrupciones, un mecanismo eficiente para que los periféricos notifiquen a la CPU sobre eventos.
Ejemplo de Código en Ensamblador ARM (Vector de Enteros)
El siguiente código en ensamblador ARM ilustra el manejo de un vector de enteros y la comparación de sus elementos con un valor. Aunque no está directamente relacionado con la E/S mapeada o no mapeada, muestra un ejemplo de programación en ensamblador ARM, que a menudo se utiliza en sistemas empotrados donde la gestión de la E/S es crucial.
AREA datos, READWRITE
Vector1 DCD 3,1,2, ... ,31,27 ; Vector de 20 enteros (completa los valores)
numero DCD 5
boolean DCD 0
iteracciones SPACE 4
AREA prog, CODE, READONLY
ENTRY
ldr r0, =Vector1
ldr r1, =numero
ldr r2, =boolean
ldr r5, [r1] ; Carga el valor de 'numero' en r5
ldr r6, =iteracciones
mov r3, #0 ; Inicializa el contador
for
cmp r3, #20 ; Compara el contador con 20
bge Done ; Si r3 >= 20, salta a Done
ldr r4, [r0, r3, LSL #2] ; Carga el elemento del vector (r3 * 4 = desplazamiento)
cmp r4, r5 ; Compara el elemento del vector con 'numero'
beq Done1 ; Si son iguales, salta a Done1
sig_dentro_for
add r3, r3, #1 ; Incrementa el contador
b for ; Vuelve al inicio del bucle
Done1
mov r5, #1 ; Establece 'boolean' a 1
str r5, [r2]
Done
str r3, [r6] ; Guarda el número de iteraciones
fin
b fin ; Bucle infinito
END
Explicación del código:
AREA
: Define secciones de memoria (datos y código).DCD
: Define constantes de palabra (32 bits).SPACE
: Reserva espacio en memoria.ENTRY
: Punto de entrada del programa.ldr
: Carga un valor en un registro.mov
: Mueve un valor a un registro.cmp
: Compara dos valores.bge
: Salta si es mayor o igual que (Branch if Greater than or Equal to).beq
: Salta si es igual (Branch if Equal to).add
: Suma.str
: Almacena un valor en memoria.LSL #2
: Desplazamiento lógico a la izquierda (multiplica por 4, el tamaño de una palabra).
Este código recorre el vector Vector1
, compara cada elemento con el valor almacenado en numero
, y si encuentra una coincidencia, establece boolean
a 1 y guarda el número de iteraciones realizadas hasta ese momento. El bucle for
itera hasta 20 veces o hasta que se encuentra una coincidencia.