Flash y RAM: Ejecución de código

10

Hace poco empecé a aprender ensamblador y conocí los scripts de vinculador y otros detalles de bajo nivel de la programación de hardware. También me estoy enseñando a mí mismo arquitectura de computadoras y, en algún momento, temí que mi imagen del modelo de memoria pudiera haber estado equivocada todo el tiempo.

De acuerdo con lo que entiendo actualmente, todo el código y los datos residen en la memoria no volátil justo después de que 'grabamos' el binario en un procesador: la memoria RAM que es volátil no contiene nada cuando se reinicia. Cuando el programa comienza a 'ejecutarse', lo hace desde la dirección 0x0000, que casi siempre es (AFAIK) la dirección más baja en Flash. Por lo tanto, las instrucciones se bloquean en el bus que conecta Flash con el núcleo de la CPU y ahí es donde se lleva a cabo la ejecución real. Sin embargo, cuando hablamos de que la CPU recupera o almacena datos de la memoria, generalmente hablamos de RAM. Soy consciente de que también podemos leer / escribir datos de la memoria del programa (he visto esto en AVR) ¿Pero no es tan común? ¿Es porque 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 fuera de la memoria RAM.

¿Esto significa que el código de tiempo de ejecución de inicio (que a su vez 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 que apunten a la RAM, de modo que la CPU recupere los códigos de operación desde allí? ? ¿Es similar al proceso en el que movemos las secciones .data de ROM a RAM en el 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 esto que todo el código y los datos deben pasar primero a través de los registros de la CPU?

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

    

3 respuestas

11

Esto depende del dispositivo.

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

microcontroladores simples

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

Sistemas de rango medio

Una vez que tu dispositivo se acelera, la situación es un poco diferente. Los sistemas ARM de rango medio también pueden hacer eso, o pueden tener un cargador de arranque ROM enmascarado que hace algo más inteligente: tal vez descargar código desde USB o EEPROM externas a la SRAM interna.

Sistemas grandes

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

Las arquitecturas de Harvard son típicamente pequeñas, así que no te molestes en la fase de copia. He visto un ARM con "hibrido 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 buscar en paralelo, siempre que no sean de la misma memoria. Así que puede obtener código de Flash y datos de SRAM, o código de SRAM y datos de DRAM, etc.

    
respondido por el pjc50
1

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

La construcción física de la 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 brinda beneficios adicionales para el desarrollador, como poder modificar el código en tiempo de ejecución.

  

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 esto que todo el código y los datos deben pasar primero a través de los registros de la CPU?

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

Por ejemplo, cuando hace referencia a la dirección 0x000f0004 en un micro, es posible que esté leyendo la dirección 0x0004 del 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 para administrar y organizar el espacio de direcciones virtuales difiere ampliamente entre las arquitecturas.

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

    
respondido por el Polynomial
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.

El sistema operativo que se ejecuta en la computadora de propósito general obtiene el código de la H.D.D y lo almacena en la RAM para un acceso más rápido. Si su procesador intenta obtener directamente del disco duro 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á 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 ubique sus datos en el chip. Si los datos son estáticos, es posible que desee ubicarlos en la memoria del código, lo que ahorrará su RAM, que es comparativamente mucho más pequeña que la memoria del Código. En lenguaje C, cuando inicialice el tipo de datos utilizando estática o en algunos datos de prefijo de compilador const, se almacenarán en la memoria de código o, de lo contrario, se almacenarán en la RAM. Y en el ensamblaje, usted usa directamente DB (Definir Byte en el caso de Basic 8051) para inicializar los 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 hardware del cargador de arranque en nivel medio y amp; Controles sofisticados que le indican a los controladores o al procesador desde dónde ejecutar el código de inicio o, en sí mismo, es el código de inicio que en realidad está segmentado en la memoria. Así que hay muchas posibilidades debido al avance, prefiero decir una recomendación híbrida en la industria que mezcla todo el concepto de RAM ROM convencional y amp; recuerdos. Así que básicamente tu confusión es válida.

    
respondido por el rahulb

Lea otras preguntas en las etiquetas