Flash y RAM: ejecución de código

13

Recientemente comencé a aprender ensamblaje y conocí los scripts de enlazador y otros detalles de bajo nivel de programación de hardware. También me estoy enseñando arquitectura de computadora y en algún punto de la línea llegué a temer que mi imagen del modelo de memoria podría haber estado equivocada todo el tiempo.

Según lo que entiendo actualmente, todo el código y los datos residen en la memoria no volátil justo después de que 'quememos' el binario en un procesador; la RAM volátil no contiene nada al reiniciar. Cuando el programa comienza a 'ejecutarse', lo hace desde la dirección 0x0000, que es casi siempre (AFAIK) la dirección más baja en Flash. Por lo tanto, las instrucciones se enganchan en el bus que conecta Flash al núcleo de la CPU y ahí es donde tiene lugar la ejecución real. Sin embargo, cuando hablamos de que la CPU está recuperando o almacenando datos de la memoria, generalmente estamos hablando de RAM: soy consciente de que también podemos leer / escribir datos de la memoria del programa (lo he visto en AVR) pero no es tan común? ¿Es porque la RAM es más rápida que la ROM que preferimos almacenar datos allí?

La respuesta aceptada a esta pregunta dice que la mayoría de las piezas de código se ejecutan sin RAM.

¿Significa esto que el código de tiempo de ejecución de inicio (que se ejecuta desde Flash) tiene que copiar todos los códigos de operación del programa de Flash a RAM y de alguna manera asigna las direcciones en Flash para apuntar a la RAM de modo que la CPU obtenga los códigos de operación desde allí? ¿Es similar al proceso en el que movemos las secciones .data de ROM a RAM al inicio?

Puedo imaginar que esto sea más simple en las arquitecturas de von Neumann, donde el programa y las memorias de datos comparten un bus, pero en las arquitecturas de Harvard, ¿no significaría que todo el código y los datos tienen que pasar primero por los registros de la CPU?

Como probablemente pueda adivinar, todo este asunto me confunde un poco. Habiendo programado siempre en un nivel de abstracción más alto, me molestan fácilmente con tales detalles. Cualquier ayuda es apreciada.

Shrikant Giridhar
fuente
2
En microcontroladores simples no hay necesidad de copiar de la memoria del programa (a menudo flash actualmente) a la RAM para ejecutar.
David
Todo se debe a que una RAM es más rápida que Flash, pero a medida que pierde datos después de una pérdida de energía, viene la memoria Flash no volátil. Cuando está encendido, los datos se cargan de Flash a RAM y la CPU comienza a funcionar, todo eso se repite.
Lazar

Respuestas:

13

Esto depende del dispositivo.

RAM se puede construir más rápido que Flash; Esto comienza a ser importante en aproximadamente el rango de 100MHz.

Microcontroladores simples

Los pequeños microcontroladores lentos se ejecutan directamente desde Flash. Estos sistemas generalmente tienen más Flash que SRAM también.

Sistemas de rango medio

Una vez que su dispositivo se vuelve más rápido, la situación es un poco diferente. Los sistemas ARM de rango medio también pueden hacer eso, o pueden tener un gestor de arranque ROM de máscara que hace algo más inteligente: tal vez descargar código de USB o EEPROM externas en la SRAM interna.

Grandes sistemas

Los sistemas más grandes y rápidos tendrán DRAM externa y Flash externo. Esto es típico de una arquitectura de teléfono móvil. En este punto, hay mucha RAM disponible y es más rápido que Flash, por lo que el gestor de arranque lo copiará y ejecutará. Esto puede implicar palearlo a través de los registros de la CPU o puede implicar una transferencia de DMA si hay una unidad de DMA disponible.

Las arquitecturas de Harvard son típicamente pequeñas, así que no te molestes con la fase de copia. He visto un ARM con "Harvard híbrido", que es un espacio de direcciones único que contiene varias memorias pero dos unidades de recuperación diferentes. El código y los datos se pueden obtener en paralelo, siempre que no provengan de la misma memoria. Por lo tanto, puede obtener código de Flash y datos de SRAM, o código de SRAM y datos de DRAM, etc.

pjc50
fuente
1

La RAM es generalmente más rápida que el flash, pero en realidad no importa hasta que alcance velocidades de reloj superiores a 80-100MHz, siempre que el tiempo de acceso al flash sea más rápido que el tiempo que lleva ejecutar una instrucción, no debería importar

La construcción física de RAM nos permite construir dispositivos muy rápidos; Mucho más rápido que el flash. En este punto, tiene sentido copiar bloques de código en la RAM antes de la ejecución. Esto también trae beneficios adicionales para el desarrollador, como poder modificar el código en tiempo de ejecución.

en las arquitecturas von Neumann donde el programa y las memorias de datos comparten un bus, pero en las arquitecturas de Harvard, ¿no significa esto que todo el código y los datos tienen que pasar primero por los registros de la CPU?

No necesariamente. Aquí es donde entra el direccionamiento virtual . En lugar de que el código del programa se refiera a las direcciones RAM de hardware sin formato, en realidad hace referencia a un espacio de direcciones virtuales. Los bloques de espacio de direcciones virtuales se asignan a dispositivos de memoria física, que pueden ser RAM, ROM, flash o incluso memorias intermedias de dispositivos.

Por ejemplo, cuando hace referencia a la dirección 0x000f0004 en un micro, puede estar leyendo la dirección 0x0004 desde la memoria flash. La dirección virtual es 0x000f0004, pero la dirección física es solo 0x0004: todo el espacio de direcciones 0x000fxxxx se asigna a un dispositivo de memoria física de 4KB. Esto es solo un ejemplo, por supuesto, y el método de administrar y organizar el espacio de direcciones virtuales difiere enormemente entre las arquitecturas.

Como tal, cuando dice que "el programa comienza a ejecutarse [...] desde la dirección 0x0000, que casi siempre es la dirección más baja en flash", no se garantiza que sea correcto. De hecho, muchos microcontroladores comienzan en 0x1000.

Polinomio
fuente
3
Hubiera dicho que la distinción se vuelve relevante alrededor de 20-40MHz, no de 100Mhz, ya que la mayoría de los dispositivos flash que he visto comienzan a requerir un estado de espera en ese punto. En muchos casos, el código flash incluirá circuitería para que cada búsqueda tome múltiples palabras de instrucción, de modo que para muchos tipos de código la "penalización" por ejecutar desde el flash sea solo del 5-10%, pero para algunos otros tipos de código (por ejemplo, con muchos saltos) la penalización puede ser mucho más severa.
supercat
Eso no es direccionamiento virtual, es E / S mapeada en memoria (la región de memoria se mapea a E / S usando un periférico, el nombre en muchas MCU es "Controlador de memoria estática"). Por supuesto, la E / S llega a otra memoria, por lo que a veces no la consideramos como E / S. Pero definitivamente no es un mapeo de memoria virtual.
Ben Voigt
1

Lo que estás diciendo no es completamente verdadero o falso. Hay diferentes escenarios para esto.

Eso depende de si está programando en el hardware en bruto o en el hardware instalado con el sistema operativo.

Su sistema operativo que se ejecuta en la computadora de uso general obtiene el código del HDD y lo almacena en la RAM para un acceso más rápido. Si su procesador intenta obtener directamente del HDD de forma continua, las operaciones serían mucho más lentas debido a la falta de coincidencia de velocidad entre dos. Entonces su RAM entra en juego donde se almacena parte de su código repetitivo para un acceso más rápido. Y eso también está aún más disponible en la memoria caché de los procesadores para hacerlo aún más rápido.

Ahora, cuando está trabajando en un microcontrolador, depende totalmente de usted dónde ubica sus datos en el chip. Si los datos son estáticos, es posible que desee ubicarlos en la memoria de código, lo que ahorrará su RAM, que es comparativamente mucho más pequeña que la memoria de código. En el lenguaje C cuando inicializa el tipo de datos usando estática o en algún compilador, los datos del prefijo const se almacenarán en la memoria de código o se almacenarán en la RAM. Y en el ensamblaje, usa directamente DB (Definir Byte en el caso de Basic 8051) para inicializar datos en la ubicación particular. Ahora, incluso en algunos controladores como PIC ARM, puede escribir ROM en el tiempo de ejecución, pero la obtención de datos llevará mucho tiempo.

Además, hay hardwares del cargador de arranque en controladores de nivel medio y sofisticados que le dicen a los controladores o al procesador desde dónde ejecutar el código de inicio o si es el código de inicio que en realidad está segmentado en la memoria. Por lo tanto, hay muchas posibilidades de avance debido , Preferiría decir un anuncio híbrido en la industria que mezcla todo el concepto de RAM ROM y memorias convencionales. Entonces, básicamente, su confusión es válida.

rahulb
fuente