Flash e RAM: Execução de Código

13

Recentemente, comecei a aprender montagem e conheci scripts de vinculador e outros detalhes de baixo nível da programação de hardware. Também estou me ensinando arquitetura de computadores e, em algum momento, tive medo de que minha imagem do modelo de memória estivesse errada o tempo todo.

De acordo com o que eu entendo atualmente, todo o código e dados residem na memória não volátil logo após "gravar" o binário em um processador - a RAM sendo volátil não contém nada na redefinição. Quando o programa começa a ser executado, ele é feito a partir do endereço 0x0000, que é quase sempre (AFAIK), o endereço mais baixo do Flash. Portanto, as instruções são travadas no barramento que conecta o Flash ao núcleo da CPU e é aí que a execução real ocorre. No entanto, quando falamos sobre a CPU recuperar ou armazenar dados da memória, geralmente falamos sobre RAM - eu sei que também podemos ler / gravar dados da memória do programa (eu já vi isso nos AVRs) mas não é tão comum? É porque a RAM é mais rápida que a ROM que preferimos armazenar dados lá?

A resposta aceita para essa pergunta diz que a maioria dos pedaços de código é executada fora da RAM.

Isso significa que o código de tempo de execução da inicialização (que é executado no Flash) precisa copiar todos os códigos de programa do Flash para a RAM e, de alguma forma, mapeia os endereços no Flash para apontar para a RAM, para que a CPU busque os códigos de lá? É semelhante ao processo no qual movemos as seções .data da ROM para a RAM na inicialização?

Posso imaginar que isso seja mais simples nas arquiteturas de von Neumann, onde o programa e as memórias de dados compartilham um barramento, mas nas arquiteturas de Harvard, isso não significa que todo o código e dados precisam passar primeiro pelos registros da CPU?

Como você provavelmente pode adivinhar, estou um pouco confuso com esse negócio todo. Tendo sempre programado em um nível de abstração mais alto, sou facilmente incomodado com esses detalhes. Qualquer ajuda é apreciada.

Shrikant Giridhar
fonte
2
Em microcontroladores simples, não há necessidade de copiar da memória do programa (geralmente flash hoje em dia) para a RAM para executar.
David David
Tudo porque uma RAM é mais rápida que o Flash, mas como perde dados após a perda de energia, chega a memória não volátil do Flash. Quando a energia é ligada, os dados são carregados do Flash para a RAM e a CPU começa a funcionar, tudo isso se repete.
Lazar

Respostas:

13

Isso depende do dispositivo.

A RAM pode ser construída mais rapidamente que o Flash; isso começa a se tornar importante na faixa de 100MHz.

Microcontroladores simples

Pequenos microcontroladores lentos são executados diretamente no Flash. Esses sistemas geralmente também têm mais Flash que SRAM.

Sistemas de médio porte

Quando o seu dispositivo fica mais rápido, a situação é um pouco diferente. Os sistemas ARM de médio porte também podem fazer isso, ou podem ter um carregador de inicialização com máscara de ROM que faz algo mais inteligente: talvez baixando código de USB ou EEPROMs externos para SRAM interna.

Sistemas grandes

Sistemas maiores e mais rápidos terão DRAM externa e Flash externo. Isso é típico de uma arquitetura de telefone móvel. Neste ponto, há bastante RAM disponível e é mais rápido que o Flash, portanto, o carregador de inicialização irá copiá-lo e executá-lo. Isso pode envolver a remoção através dos registros da CPU ou a transferência de DMA, se uma unidade DMA estiver disponível.

As arquiteturas de Harvard são tipicamente pequenas, então não se preocupe com a fase de cópia. Eu vi um ARM com "harvard híbrido", que é um espaço de endereço único que contém várias memórias, mas duas unidades de busca diferentes. Código e dados podem ser buscados em paralelo, desde que não sejam da mesma memória. Então você pode buscar código do Flash e dados da SRAM, ou código da SRAM e dados da DRAM etc.

pjc50
fonte
1

A RAM geralmente é mais rápida que o flash, mas isso realmente não importa até que você atinja velocidades de clock superiores a 80-100 MHz ou mais - desde que o tempo de acesso ao flash seja mais rápido do que o tempo necessário para executar uma instrução, não deveria importar.

A construção física da RAM nos permite construir dispositivos muito rápidos; muito mais rápido que o flash. Neste ponto, faz sentido copiar blocos de código na RAM antes da execução. Isso também traz benefícios adicionais para o desenvolvedor, como poder modificar o código em tempo de execução.

nas arquiteturas von Neumann, onde o programa e as memórias de dados compartilham um barramento, mas nas arquiteturas de Harvard, isso não significa que todo o código e dados precisam passar primeiro pelos registros da CPU?

Não necessariamente. É aqui que entra o endereçamento virtual . Em vez de o código do programa se referir aos endereços de RAM do hardware bruto, ele na verdade faz referência a um espaço de endereço virtual. Blocos de espaço de endereço virtual são mapeados para dispositivos de memória física, que podem ser RAM, ROM, flash ou até buffers de dispositivo.

Por exemplo, quando você faz referência ao endereço 0x000f0004 em um micro, pode estar lendo o endereço 0x0004 no flash. O endereço virtual é 0x000f0004, mas o endereço físico é apenas 0x0004 - todo o espaço de endereço 0x000fxxxx é mapeado para um dispositivo de memória física de 4KB. Este é apenas um exemplo, é claro, e o método de gerenciar e organizar o espaço de endereço virtual difere bastante entre as arquiteturas.

Assim, quando você diz que "o programa começa a executar [...] a partir do endereço 0x0000, que quase sempre é o endereço mais baixo em flash", você não garante que esteja correto. De fato, muitos microcontroladores começam em 0x1000.

Polinomial
fonte
3
Eu diria que a distinção se torna relevante em torno de 20-40MHz, e não 100Mhz, já que a maioria dos dispositivos flash que eu vi começaram a exigir um estado de espera nesse ponto. Em muitos casos, o código flash incluirá circuitos para que cada busca obtenha várias palavras de instrução, de modo que, para muitos tipos de código, a "penalidade" pela execução do flash seja de apenas 5 a 10%, mas para alguns outros tipos de código. código (por exemplo, com muitos saltos), a penalidade pode ser muito mais severa.
Supercat 13/03
Isso não é endereçamento virtual, é E / S mapeada na memória (a região da memória é mapeada para E / S usando um periférico, o nome em muitos MCUs é "Static Memory Controller"). Obviamente, a E / S alcança outra memória, portanto, às vezes, não pensamos nela como E / S. Mas definitivamente não é um mapeamento de memória virtual.
Ben Voigt
1

O que você está dizendo não é completamente verdadeiro ou falso. Existem diferentes cenários para isso.

Isso depende se você está programando no hardware bruto ou no hardware instalado com o SO.

Seu sistema operacional em execução no computador de uso geral busca o código do HDD e o armazena na RAM para um acesso mais rápido. Se o seu processador tentar buscar diretamente no HDD continuamente, as operações serão muito mais lentas devido à incompatibilidade de velocidade entre dois. Assim, sua RAM entra em jogo, onde parte do seu código repetitivo é armazenada para acesso mais rápido. E isso também é disponibilizado ainda mais nos processadores que a memória cache, para torná-la ainda mais rápida.

Agora, quando você está trabalhando no microcontrolador, depende totalmente de você onde você localiza seus dados no chip. Se os dados forem estáticos, você poderá localizá-los na memória de código, o que economizará sua RAM, comparativamente muito menor que a memória de código. Na linguagem C, quando você inicializa o tipo de dados usando estático ou em algum compilador, os dados do prefixo const serão armazenados na memória de código ou, então, na RAM. E na montagem você usa diretamente o DB (Definir Byte no caso do Basic 8051) para inicializar dados no local específico. Agora, mesmo em alguns controladores como o PIC ARM, você pode gravar ROM em tempo de execução, mas a busca de dados levará muito tempo.

Além disso, existem hardwares de carregador de inicialização em controladores sofisticados e de nível médio, que informa aos controladores ou processador de onde executar o código de inicialização ou ele próprio é o código de inicialização que é realmente segmentado na memória. Portanto, existem muitas possibilidades de avanço. , Eu preferiria dizer que o híbrido advnacement na indústria que mescla todo o conceito de ROM e memórias RAM convencionais. Então, basicamente, sua confusão é válida.

rahulb
fonte