Unidade de gerenciamento de memória
# Unidade de gerenciamento de memória

Unidade de Gerenciamento de Memória ou MMU (do inglês Memory Management Unit) é um dispositivo de hardware que traduz endereços virtuais em endereços físicos, é geralmente implementada como parte da Unidade Central de Processamento ou CPU (Central Processing Unit), mas pode também estar na forma de um circuito integrado separado. Um MMU é efetivo em gerenciamento de memória virtual, manipulação e proteção de memória, controle de cache e, em arquiteturas mais simples de computador, como em sistemas de 8 bits, bank switching.
Em designs anteriores de microprocessadores, o gerenciamento de memória era feita por um circuito integrado separado como o do VLSI VI475 (1986), o Motorola 68851(1984) usado com a CPU do Motorola 68020 no Macintosh II, ou o Z8015 (1985) usado com a família de processadores Zilog Z8000. Mais tarde microprocessadores como o do Motorola 68030 a o Zilog Z280 colocaram a MMU junta com a CPU um mesmo circuito integrado assim como fez a Intel 80286 e mais tarde os processadores x86.
Na MMU, o valor no registro de re-locação é adicionado a todo o endereço lógico gerado por um processo do utilizador na altura de ser enviado para a memória.
O programa do utilizador manipula endereços lógicos; ele nunca vê endereços físicos reais.

## Funcionamento

A memória principal está dividida em dois tipos: a memória física e a memória lógica. A memória lógica é aquela que é visível para os programas, sempre que um programa utilizar memória é esta que estará sendo utilizada. A memória física é a que é implementada em circuitos digitais e é nela que a memória lógica é fisicamente armazenada, geralmente a memória lógica é maior do que a memória física. Para que isso funcione é necessário que seja realizada uma tradução de endereços lógicos para endereços físicos de memória para que um programa que utiliza da memória lógica possa ter uma memória física alocada para si. Para isso é necessário um processo de tradução de endereços lógicos para endereços físicos e esse processo é realizado pela unidade de gerenciamento de memória (MMU).
O sistema atual de MMU divide o espaço de endereçamento virtual (endereços utilizados pelo processador) em páginas, cujo tamanho é de 2$^n$, normalmente essas páginas possuem poucos kilobytes mas podem ser muito maiores. A maioria dos MMUs usa uma tabela páginas na memória chamado de "Page table" (Tabela de página), contendo uma "Page table entry" (PTE ou Entrada da tabela de páginas em português) por página, para mapear números de páginas virtuais para números de páginas físicas na memória principal. A PTE (Page table entry) usa uma cache associada chamada Translation Lookaside Buffer (TLB) que é utilizado para evitar a necessidade de acessar a memória principal toda vez que um endereço virtual é acessado. Outras Unidades de gerenciamento de memória podem ter uma matriz privada de memória ou registradores que mantenham um conjunto de tabelas de páginas. Quando o TLB falha uma tradução, um mecanismo mais lento envolvendo um hardware específico de dados estruturados ou um software auxiliar é usado.
Normalmente o tamanho de uma página é de 4 KiB. Sendo assim, em um espaço de endereçamento de 32 bits, cada processo tem acesso a 4 GiB de memória virtual, o que corresponde a 1 MB de páginas de memória.
A PTE também tem informações referente à modificação/escrita da página (dirty bit), quando ela foi utilizada pela última vez (bit de acesso para a LRU(Least recently used) algoritmo de substituição de página), que tipo de processos podem ler e escrever na página e se ela deve ir para a cache.
Às vezes, a PTE proíbe o acesso a uma página virtual, porque esta talvez não esteja alocada na memória RAM física. Neste caso a MMU sinaliza uma “falha na página" para a CPU, a partir daí o sistema operacional então tenta encontrar um espaço vazio na RAM e gera uma nova PTE para mapear essa página para o endereço virtual requisitado.

## Vantagens

Em alguns casos, um erro de página pode indicar um “bug” no software, que pode ser prevenido através da proteção de memória: um sistema operacional pode usá-lo para proteger contra programas “errantes”, não permitindo o acesso à memória que um programa específico não deveria ter acesso. Normalmente, um sistema operacional atribui a cada programa de seu próprio espaço de endereço virtual.
A MMU também diminui o problema da fragmentação da memória. Depois de blocos de memória serem alocados e liberados, a memória livre pode ficar fragmentada. Com a memória virtual, uma faixa continua de endereços virtuais podem ser mapeados em vários blocos não contínuos de memória física, esse mapeamento de endereços virtuais não contínuos é um dos benefícios da paginação.

## Desvantagens

A TLB(Translation Lookaside Buffer) tem um custo elevado devido ao custo dos registradores que possuem também um preço elevado, seu tamanho é limitado e cada MMU possui apenas uma única TLB sendo esta então compartilhada por todos os processos.

## Exemplos

Muitos sistemas modernos dividem a memória em páginas com o tamanho de 4 a 64 KiB, normalmente com a capacidade para usar paginas grandes de 2 MiB a 1 GiB. As traduções das páginas são armazenados na TLB(Translation lookaside buffer).

### ARM

Processadores de aplicativos baseados na arquitetura ARM implementam uma MMU definida pela arquitetura do sistema de memória virtual do ARM. A ARM utiliza uma tabela de página de dois níveis se estiver usando páginas de 4 KB e 64 KB, ou uma tabela de página de um nível no caso de páginas de 1 MB e 16 MB. PTEs incluem permissão de leitura/acesso de gravação baseado no privilégio, informações que serão alocadas na memória cache, e o Bit NX.

### VAX

As páginas do VAX são de 512 bytes, o que é relativamente pequeno comparado com outros sistemas por isso o Sistema operacional pode tratar várias páginas como se fossem uma página maior. Por exemplo, o Linux no VAX agrupa oito páginas assim o sistema é visto como se tivesse páginas de 4 KiB. O VAX divide a memória principal física em quatro regiões cada uma com 1 GiB, e cada uma dessas quatro regiões tem um propósito fixo, são elas.
* P0: Usada para propósitos gerais;
* P1: Usado para controle;
* S0: Espaço do sistema que é global para todos os processos e operações de armazenamento, código e dados;
* S1: Que não é utilizado, é um espaço reservado;
A MMU do VAX não possui o Bit de Acesso (Accessed Bit) portando os Sistemas Operacionais que implementam a paginação devem encontrar um meio de emular o bit de acesso para que este possa funcionar eficientemente.

### IA-32/x86

A arquitetura x86 possui uma MMU muito complexa com vários modos de operação devido à compatibilidade que foi mantida ao longo dos anos com a evolução do x86. Na IA-32 a CPU primeiro divide a memória em páginas de 4 KiB, o endereço da memória é mascarado para que não seja maior do que 32 bits. O resultado desse endereço pode ser pesquisado através de uma estrutura de árvore, que é dividido da seguinte forma 10 bits para a raiz, 10 bits para as folhas e os outros 12 bits são copiados diretamente para o resultado.

### x86-64

A x86-64 é uma extensão de 64 bits do x86, a diferença é que quando usado páginas de 4 KiB a tabela de páginas tem quatro níveis ao invés de três. O endereço virtual é dividido em 9 bits para cada um dos quatro níveis da árvore, 12 bits copiados diretamente para o resultado e os 16 restantes ficam inutilizados. Em páginas de 2 MiB são apenas 3 níveis da tabela de páginas. Algumas CPUs mais novas da arquitetura x86 também suportam páginas de 1 GiB com dois níveis de paginação.

### Heterogeneous System Architecture (HSA)

A arquitetura de sistema heterogêneo ou HSA (Heterogeneous System Architecture em inglês) é uma arquitetura de processador que integra a CPU com os processadores gráficos (GPUs) no mesmo barramento com tarefas e memória compartilhada. Essa arquitetura possui um espaço de endereço virtual unificado para CPUs, GPUs e DSPs, tornando obsoleto os sistemas de mapeamento e cópia de dados das arquiteturas atuais.