¿Qué significa exactamente cuando alguien dice "memory-mapping","IO Mapping","Memory Mapped IO" y "Port Mapped IO"?

Todas estas palabras se vuelven un poco confusas para mí, ya que soy un novato. Entiendo que básicamente un microcontrolador es procesador + memoria para almacenar datos (RAM) + memoria de datos O desde donde se ejecutan las instrucciones (ROM/Flash) + Periféricos.

  1. ¿Cómo se supone que debo visualizar el mapeo?
  2. ¿El mapeo se hace en la RAM?
  3. Si es así, ¿no es la memoria misma? ¿Cómo lo sabe el procesador?
  4. ¿Este mapeo se realiza cuando enciendo el Controlador o lo realiza la persona/Compañía que fabricó el controlador?

si es realmente una pregunta estúpida o amplia, házmelo saber. Intentaría acotarme.

Está confundiendo el espacio de direcciones de la memoria con la memoria misma.
¿Qué tipo de literatura o libros de texto sobre arquitectura informática digirió antes de publicar esta pregunta?
Para preguntas de terminología o preguntas como "¿qué es?" consulte siempre Wikipedia primero, por ejemplo, en.wikipedia.org/wiki/Memory-mapped_I/O . Solía ​​cubrir la mayoría de los aspectos de la pregunta. Luego, si algo no está claro o si tiene un problema real, haga una pregunta sobre el problema o este aspecto muy específico. De esta forma ahorrarás tiempo y tendrás información de forma más estructurada.
@IgnacioVazquez-Abrams juro que lo hice
@ AliChen 8085 libros de arquitectura y algunas respuestas en este sitio que me dejaron confundido. Realmente tuve problemas para entender cómo los discos duros de la PC colocan los programas OS/ejecutables en la RAM. Pensé que la dirección de memoria del disco duro está asignada a la RAM
Una unidad de disco (dura, disquete u óptica) es un dispositivo de E/S: tendrá algunos registros de control y datos que ocupan algunas ubicaciones de memoria o E/S. El programa emitirá comandos al controlador del disco como "dame un bloque de datos que comience en la pista X sector Y", y el controlador del disco leerá esos datos del disco y los colocará en un registro de datos donde el programa pueda verlos. . No puede ejecutar un programa directamente desde el disco.
"cómo los discos duros de la PC colocan los programas OS/ejecutables en la RAM": esta es una pregunta diferente. Los discos suelen tener una capacidad de almacenamiento mucho mayor que la RAM, por lo que no se pueden asignar directamente al espacio de memoria. Solo algunas pequeñas porciones (programas) pueden transferirse y CARGARSE en la RAM para su ejecución.

Respuestas (4)

Creo que estos términos se usan principalmente con microprocesadores, en lugar de microcontroladores.

Los dispositivos de E/S "asignados en memoria" simplemente aparecen como ubicaciones de memoria normales y pueden leerse o escribirse mediante cualquier instrucción que pueda leer o escribir en la memoria de datos normal. La E/S mapeada en memoria puede ser utilizada por cualquier microprocesador.

Algunos microprocesadores (Intel 8085 y similares) tienen un espacio de direcciones separado para uso de dispositivos de E/S, que no forma parte del espacio de memoria normal, y un número limitado de instrucciones para leer o escribir en ese espacio de direcciones. Los dispositivos de E/S que utilizan este espacio serían "E/S asignadas".

Interesante. ¿Y cómo define la diferencia en el mapeo entre "un microcontrolador" y "un microprocesador"? Aparte de que en el primer caso, el mapeo suele estar predefinido (fijo) por el fabricante del circuito integrado, mientras que en el segundo caso, el mapeo debe ser elegido por el propio diseñador del sistema. En mi opinión, el concepto de mapeo es el mismo.
Con un microcontrolador, los buses de direcciones y datos no suelen estar disponibles externamente, por lo que el usuario no tiene más remedio que acceder a los puertos de E/S tal y como el fabricante pretendía, por lo que no tiene mucho sentido hablar de modos de acceso de E/S con microcontroladores. . Con los microprocesadores, los buses de dirección y datos, y las líneas de control necesarias, son accesibles para el usuario, por lo que puede elegir cómo implementar E/S (pero algunos microcontroladores no tienen espacio e instrucciones de E/S específicos, por lo que está atascado con E/S mapeadas en memoria).

Nadie parece haber dicho esto directamente, así que lo haré; básicamente significa que los dos tipos de mapeo tienen diferentes líneas de control. Considere la muy querida (al menos por mí, je) arquitectura Z80, que tiene E/S y memoria separadas.

Ambos tipos de mapeo usan el mismo bus de direcciones (16 líneas) y datos (8 líneas). Para decirle a la lógica externa si está direccionando memoria o IO, el procesador tiene dos pines; uno se llama MREQ y el otro es IORQ. Cuando el procesador baja MREQ, la lógica externa se configura para reconocer que se trata de una dirección de memoria en el bus de direcciones y conecta la memoria al bus de datos después de decodificar el bus de direcciones, para lecturas o escrituras de datos (que están controladas por el RD (lectura) y WR (escritura), uno de los cuales bajará para la operación de lectura o escritura.

Si el procesador reduce el IORQ, su lógica externa lo reconoce como una solicitud de E/S y conecta algún dispositivo externo al bus de datos, después de decodificar el bus de direcciones. La memoria permanece desconectada. En la práctica, la mayoría de los chips de memoria realizan la decodificación de direcciones y la conexión/desconexión mediante lógica de control interno.

Si el procesador baja tanto MREQ como IORQ al mismo tiempo, está roto. Tirar a la basura. Lo que baja depende de distintas instrucciones en el conjunto de instrucciones utilizado por el programador.

Entonces, todo depende de si hay líneas de control en el procesador para distinguir más de un modo para los buses. La ventaja es que puede usar todo el espacio de direcciones para la memoria y aún así tener un medio para conectarse a dispositivos externos, que son libres de usar muchas ubicaciones de direcciones para facilitar la interfaz, ya que hay potencialmente 64k de ellos disponibles (con un 16 bit autobús).

Una rareza curiosa con el Z80 es que su especificación afirma que solo usa 8 bits del bus de direcciones para IO, controlado por el registro C, pero de hecho codifica los 16, usando el par BC (en las instrucciones de entrada y salida). Lo cual es bueno.

El mapeo generalmente se realiza con hardware dedicado en silicio, generalmente bajo los auspicios de la CPU. Veamos sus cuatro frases muy rápidamente:

  • mapeo de memoria
  • Mapeo de E/S
  • E/S mapeada en memoria
  • Puerto E/S asignado

Mi instinto dice que su uso del mapeo de memoria y el mapeo de IO proviene de los espacios de memoria dual del sistema basado en x86: los 64K de IO Space que están esencialmente en desuso, y luego el espacio de memoria mucho más grande, que creo que varía en los exabytes ahora con máquinas de 64 bits.

EDITAR: voy a agregar este párrafo a mi respuesta, suponiendo que lo que está preguntando está más enfocado en el microcontrolador (PIC, AVR, etc.). Me refiero a eso un poco para responder a su pregunta número cuatro. El mapeo / direcciones aquí son básicamente fijados por los arquitectos de chips, y generalmente hay una unidad de gestión de memoria / decodificador de direcciones (no en el sentido estricto de MMU) que envía datos al lugar correcto en el bus interno. Es decir, si escribe en un registro de control UART, afecta los flip-flops que son físicamente responsables de esos bits, si lee desde una dirección SRAM, devuelve los datos directamente desde allí.

De cualquier manera, el mapeo es la misma tarea general: tomar una dirección específica y darle un significado especial / enrutarla a algún lugar. Por ejemplo, en una plataforma x86, la dirección del espacio de E/S 0x3F8 apunta al registro del puerto serie del sistema. Cuando escribe o lee desde esta dirección (outb()/inb()), está cambiando físicamente el estado de 8 bits (implementados probablemente como SRAM o flip-flops) que contienen datos en ese puerto serie.

Del mismo modo, para la E/S asignada a la memoria, es posible que tenga un dispositivo PCI que solicite cierta cantidad de memoria. Podría diseñar un dispositivo en el que si escribe un byte en una dirección específica, eso cambia el estado de 8 LED: 0x00, todo apagado, 0xFF, todo encendido. Su MMU (unidad de administración de memoria) es responsable de reconocer que la dirección de memoria que escribió también está destinada a algo en el bus PCI.

No voy a sumergirme en la memoria virtual aquí; en los sistemas operativos modernos, generalmente solo el código del kernel/código privilegiado tiene la oportunidad de leer/escribir directamente desde las direcciones de la memoria física. Hay capas de infraestructura / abstracción integradas para controlar este acceso para las aplicaciones de los usuarios. Podría leer en las tablas de páginas, por ejemplo.

Entonces, volviendo a tus preguntas...

1) ¿Cómo se supone que debo visualizar el mapeo?

Solo eso: un mapeo. Es un mapa que le indica cómo llegar desde su inicio (una dirección, por ejemplo, 0xE0000000) hasta el destino (quizás un dispositivo PCI, quizás una ubicación específica en la memoria RAM física).

2) ¿Se realiza el mapeo en la RAM?

No. La RAM física, digamos, en el nivel más bajo, un capacitor individual que representa un solo bit en DRAM, es uno de los muchos destinos que también se pueden mapear. Cada dirección de memoria individual no corresponde necesariamente a un bit físico almacenado en alguna parte.

Si tiene un procesador que tiene una dirección externa/bus de datos (o algún otro bus paralelo grande), entonces las lecturas/escrituras se traducirán directamente en tráfico en esa interfaz; la mayoría de la gente en estos días usará SPI/I2C/otros protocolos seriales , pero no era raro tener grandes sistemas integrados donde las SRAM paralelas se conectarían a través de una interfaz paralela de 8 o 16 bits (AD0-AD15).

3) En caso afirmativo, ¿no es la memoria misma? ¿Cómo lo sabe el procesador?

En los sistemas x86, la mayor parte de la administración de bajo nivel del mapa de memoria del sistema, que tiene más de 20 años de legado, la realiza el firmware del BIOS y luego la inicialización del sistema operativo.

4) ¿Este mapeo se realiza cuando enciendo el controlador o lo realiza la persona/compañía que fabricó el controlador?

Hay mapeos fijos en silicio (muy cierto para los microcontroladores integrados), en los que puede examinar la hoja de datos y obtener direcciones fijas para registros de control, periféricos, etc. Los arquitectos del chip diseñaron un mapa de memoria que tenía sentido para ellos, y generalmente deja provisiones para diferentes modelos con diferentes periféricos/cantidades de memoria (es decir, un modelo de 32 KB y 64 KB del mismo chip puede tener todos sus registros/periféricos en las mismas ubicaciones, y solo la dirección de memoria para la RAM es diferente).

Para sistemas más sofisticados donde las cosas pueden moverse (como PCI plug and play), la asignación de direcciones de memoria es dinámica y ejecutada por software.

Eso parece bastante hasta el punto

Este es un ejercicio interesante. Déjame ofrecerte mi variante.

1) ¿Cómo se supone que debo visualizar el mapeo? - como un mapa de una calle, con unidades de almacenamiento (¡la memoria almacena datos!), donde cada unidad tiene una dirección de calle única. La memoria se puede organizar en "páginas". Esto es como el mismo mapa de calles con el mismo rango de direcciones, solo que en una ciudad diferente con un código postal diferente (selector de página).

2) ¿Se realiza el mapeo en la RAM? - No estoy seguro de qué quiere decir "en la RAM", pero el mapeo se realiza mediante una unidad lógica especial llamada "descodificador de direcciones". Es como una oficina de correos. La CPU arroja un número (dirección de almacenamiento) y el decodificador "abre" la "unidad de almacenamiento" correspondiente. La CPU puede entonces almacenar algunos datos o puede recuperar datos almacenados.

3) En caso afirmativo, ¿no es la memoria misma? - no, ver (2) arriba. Alguien ("descodificador de direcciones") debe mirar el número (dirección solicitada), buscar el mapa y abrir la ubicación de almacenamiento adecuada ("puerta") para una operación de lectura/escritura.

3a) ¿Cómo lo sabe el procesador? - no es asi. El controlador de memoria solo entrega los datos de acuerdo con el "mapa". Pero el programador de software debe saber qué área está mapeada y qué "unidad de almacenamiento" usar.

4) ¿Este mapeo se realiza cuando enciendo el controlador o lo realiza la persona/compañía que fabricó el controlador? - Eso depende. Los microcontroladores más pequeños tienen el mapa codificado en hardware. Los procesadores más grandes con memoria instalable por el usuario (como DIMM en PC) necesitan determinar las particularidades de las memorias instaladas y configurar el controlador de memoria (establecer rangos de decodificación de direcciones y otros parámetros como tiempo de acceso, etc.) durante la inicialización por parte del BIOS.

Tenga en cuenta que las memorias generalmente se entienden como unidades de almacenamiento internas y, por lo general, no están expuestas al mundo externo (periférico). Los dispositivos periféricos interactúan con los componentes internos del procesador a través de algunos registros de E/S dedicados, o GPIO, registros de entrada y salida de uso general. Algunas arquitecturas de procesador tienen estos GPIO asignados al mismo mapa de direcciones, a una "subdivisión" remota separada. Algunas arquitecturas tienen un espacio de E/S dedicado y tienen instrucciones de E/S dedicadas. La selección de diferentes GPIO sigue la misma idea: el decodificador de direcciones selecciona "puertas" predefinidas.

Hay otros espacios, como el "espacio de configuración", que pueden tener un modo especial de acceso restringido. También se puede mapear en el espacio de direcciones de la memoria.