# NVRAM

NVRAM (acrônimo para Non-Volatile Random Access Memory, que significa memória não volátil de acesso aleatório em inglês) é um tipo de memória que mantém seus dados mesmo sem a alimentação de energia.
No caso dos computadores (mais especificamente a família x86), a NVRAM é a memória utilizada para manter as configurações do BIOS, com um tamanho de 256 bytes.
Quando o computador é ligado, é gerado um número somando todos os words do BIOS e depois é verificado se este número é igual ao ultimo número salvo. Caso seja diferente os dados desta memória por algum motivo estão "danificados", e é exibida a mensagem "Update Failed..." (que significa A atualização falhou...) ou "CMOS Checksum Error" (que significa Erro de Soma de Verificação do CMOS), o que é mais comum quando a bateria do computador está fraca.
Em alguns tipos de computadores, alguns dados são mudados quando o computador liga. Quando acontece algum problema na atualização dos dados ou os dados estão corrompidos, o BIOS normalmente é reconfigurado com a configuração padrão (mais lenta, já que deve suportar todos os processadores) e a mensagem é exibida. Isto é muito comum em computadores com a bateria fraca ou quando a placa mãe é de má qualidade.

## Definindo a volatilidade

* Voláteis - São aquelas que, quando têm seu suprimento de energia interrompido, perdem suas informações armazenadas. Geralmente produzidos a partir de semicondutores, podendo conter em sua estrutura o flip-flop. Um exemplo deste tipo são as RAM.
* Não Voláteis - Quando o fluxo de energia é interrompido, continuam com suas informações armazenadas, destacando-se as memórias eletrônicas ROM, PROM e a EEPROM.
À medida que as tecnologias das memórias evoluíram nos últimos anos, o limiar entre os dispositivos RAM e ROM tornou-se impreciso. Atualmente existem diversos tipos de memória que combinam as melhores características de ambas. Esses dispositivos não pertencem a nenhum dos grupos e podem ser chamados coletivamente de dispositivos de memória híbrida. As memórias híbridas podem ser lidas e gravadas conforme desejado, como a RAM, mas mantendo seu conteúdo sem energia elétrica, assim como a ROM. Dois dos dispositivos híbridos, EEPROM e Flash, são descendentes de dispositivos ROM; a terceira e que mais nos interessa aqui é a NVRAM, que é uma versão modificada da SRAM.
Para saber mais acerca dos dispositivos EEPROM, Flash e ROM, consulte o livro sobre programação de sistemas embarcados em C e C++ mencionado nas referências deste artigo.
O terceiro membro da classe de memórias híbridas é a NVRAM. A Não-Volatilidade é uma característica tanto das ROM, quanto das memórias híbridas mencionadas anteriormente. No entanto memórias não voláteis são fisicamente muito diferentes destes dispositivos. Normalmente uma memória não volátil é apenas uma SRAM com uma bateria para alimentação. Quando essa energia é ligada, as memórias não voláteis funcionam como qualquer outra SRAM, mas quando a energia é interrompida, as memórias não voláteis passam a usar energia a partir da bateria em quantidades suficientes para apenas preservar o seu conteúdo. Memórias não voláteis são muito comuns em sistemas embarcados, no entanto elas possuem um alto custo, até maior do que as SRAM, por isso suas aplicações normalmente limitam-se ao armazenamento de poucas centenas de bytes de informações críticas do sistema que não são guardadas de uma maneira melhor.
Características dos dispositivos de memória :
| Tipo de Memória | Volátil? | Escrita? | Tamanho de Limpeza? | Apagar Ciclos? | Custo x Benefício | Velocidades |
| SRAM | Sim | Sim | Byte | Ilimitada | Caro | Rápido |
| DRAM | Sim | Sim | Byte | Ilimitada | Moderado | Moderado |
| Mascara ROM | Não | Não | n/a | n/a | Barato | Rápido |
| PROM | Não | Uma vez, com programador | n/a | n/a | Moderado | Rápido |
| EPROM | Não | Sim, com programador | Chip | Limitado | Moderado | Rápido |
| EEPROM | Não | Sim | Byte | Limitado | Caro | Rápido para Leitura / Lento para escrita |
| Flash | Não | Sim | Setor | Limitado | Moderado | Rápido para Leitura / Lento para escrita |
| NVRAM | Não | Sim | Byte | Nenhum | Caro | Rápido |

## Definindo exemplos de NVRAM - SRAM e EEPROM

SRAM usa fontes alternativas de energia, como baterias para armazenar dados. É geralmente usada para armazenar configurações de hardware do computador que precisam ser mantidos quando o computador é desligado. Exemplos comuns incluem configurações de BIOS em computadores Windows ou configurações de PROM em sistemas Macintosh. Visto que a SRAM geralmente usa uma bateria para manter a memória, se a bateria estiver descarregada ou desconectada, os dados armazenados serão perdidos. Portanto, se as configurações do BIOS ou PRAM não forem mantidas após a reinicialização do computador, é provável que a bateria do computador esteja esgotada e precise ser substituída.
A EEPROM usa cargas eletricas, que mantém seu estado sem energia, para armazenar dados. Portanto, a EEPROM não requer baterias ou outras fontes de energia para salvar os dados. O tipo mais comum de EEPROM é a memória flash, que é usada em unidades de chaveiro USB e outros dispositivos eletrônicos portáteis.

## Gravações e leituras NVRAM

Consideramos três configurações de gerenciamento de cache:
* A primeira opção, Buffer de software, depende de um software para gerenciar um cache de buffer DRAM, como no convencional bancos de dados com suporte de disco.
* Em segundo lugar, podemos omitir o cache ou dependem exclusivamente de um buffer de hardware, como na memória principal bancos de dados. Os caches de hardware são rápidos (por exemplo, SRAM no chip) e remover a complexidade do software, mas fornecer capacidade limitada.
* Terceiro, podemos replicar para DRAM todos os dados armazenados em NVRAM - grava, atualiza DRAM e NVRAM (para recuperação), mas lê, recupera dados exclusivamente de DRAM. A replicação de dados garante leituras rápidas, evitando latências de leitura de NVRAM (exceto para recuperação) e simplifica o gerenciamento de buffer, mas requer grande capacidade de DRAM.
As gravações persistentes, ao contrário das leituras, não se beneficiam do armazenamento em cache; as gravações persistem no dispositivo para correção da recuperação. Além disso, as atualizações de NVRAM devem ser cuidadosamente ordenada para garantir uma recuperação consistente. Assumimos que a ordem é aplicada por meio de um mecanismo que chamamos de barreira persist, que garante que grava antes da barreira persistir antes de qualquer operação dependente após a persistência da barreira.
Barreiras persistentes podem ser implementadas de várias maneiras, o mais fácil, mas com pior desempenho, é atrasar em persistir as barreiras até que todas as gravações NVRAM pendentes persistam com sucesso. Mais mecanismos complicados melhoram o desempenho, permitindo que os dados originais da página sejam copiados para o registro da página. O log da página é marcado como válido e a versão suja da página é copiada para NVRAM (atualizado no local enquanto os bloqueios são mantidos).
Finalmente, o log está marcado como inválido. Quatro barreiras persistentes garantem que cada persistência é concluída antes da próxima, reforçando a consistência em todos os pontos da execução. A recuperação verifica os sinalizadores válidos de todos os registros da página, copiando os registros válidos de volta ao local. O registro é sempre válido enquanto a página permanece no local, protegendo contra gravações NVRAM parciais.