Os sistemas mais modernos dividem a memória em páginas de 4-64 KB de tamanho, muitas vezes com a capacidade de usar as chamadas páginas enormes de 2 MB ou 1 GB de tamanho (muitas vezes ambas as variantes são possíveis). As traduções de páginas são armazenadas em cache em um buffer de tradução (TLB). Alguns sistemas, principalmente projetos RISC mais antigos, travam no sistema operacional quando uma tradução de página não é encontrada na TLB. A maioria dos sistemas usa um andador de árvore baseado em hardware. A maioria dos sistemas permite que a MMU seja desativada, mas alguns desativam a MMU quando se trava em código OS.
VAXEdit
VAX páginas são 512 bytes, o que é muito pequeno. Um sistema operacional pode tratar várias páginas como se fossem uma única página maior. Por exemplo, o Linux em VAX agrupa oito páginas juntas. Assim, o sistema é visto como tendo 4 páginas KB. O VAX divide a memória em quatro regiões de propósito fixo, cada uma com 1 GB de tamanho. Elas são:
espaço P0 Utilizado para memória de propósito geral por processo, como pilhas. Espaço P1 (ou espaço de controle) que também é por processo e é tipicamente usado para supervisor, executivo, kernel, pilhas de usuários e outras estruturas de controle por processo gerenciadas pelo sistema operacional. Espaço S0 (ou espaço do sistema) que é global para todos os processos e armazena o código e dados do sistema operacional, paginado ou não, incluindo tabelas de páginas. S1 espaço que não é utilizado e “Reservado ao Digital”.
As tabelas de páginas são grandes matrizes lineares. Normalmente, isto seria muito desperdício quando os endereços são usados em ambos os extremos do intervalo possível, mas a própria tabela de páginas para aplicações é armazenada na memória paginada do kernel. Assim, há efetivamente uma árvore de dois níveis, permitindo que as aplicações tenham um layout de memória esparsa sem desperdiçar muito espaço em entradas de tabela de páginas não utilizadas. O VAX MMU é notável pela falta de um bit acessado. Os sistemas operacionais que implementam paging devem encontrar alguma forma de emular o bit acessado se quiserem operar eficientemente. Tipicamente, o sistema operacional irá periodicamente desenhar páginas para que as falhas não presentes na página possam ser usadas para permitir que o sistema operacional configure um bit acessado.
ARMEdit
ARM implementam uma MMU definida pela arquitetura do sistema de memória virtual do ARM. A arquitetura atual define PTEs para descrever 4 KB e 64 KB páginas, 1 MB seções e 16 MB super-seções; versões legadas também definiram uma página minúscula de 1 KB. O ARM usa uma tabela de páginas de dois níveis se usar 4 KB e 64 KB páginas, ou apenas uma tabela de páginas de um nível para seções de 1 MB e 16 MB seções.
TLB atualizações são realizadas automaticamente por hardware de caminhada de tabela de páginas. PTEs incluem permissão de acesso de leitura/gravação baseada em privilégios, informações de cache, um bit NX e um bit não seguro.
IBM System/360 Modelo 67, IBM System/370, e sucessoresEdit
O IBM System/360 Modelo 67, que foi introduzido em agosto de 1965, incluiu uma MMU chamada caixa de tradução dinâmica de endereços (DAT). Ela tem a característica incomum de armazenar bits acessados e sujos fora da tabela de páginas (juntamente com a chave de proteção de quatro bits para todos os processadores S/360). Eles se referem à memória física e não à memória virtual, e são acessados por instruções de propósito especial. Isto reduz a sobrecarga para o sistema operacional, que de outra forma precisaria propagar bits acessados e sujos das tabelas de página para uma estrutura de dados mais orientada fisicamente. Isto torna a virtualização ao nível do SO, mais tarde chamada de paravirtualização, mais fácil.
Iniciando em agosto de 1972, o IBM System/370 tem uma MMU similar, embora inicialmente suportasse apenas um espaço de endereço virtual de 24 bits em vez do espaço de endereço virtual de 32 bits do System/360 Modelo 67. Ele também armazena os bits acessados e os bits sujos fora da tabela de páginas. No início de 1983, a arquitetura System/370-XA expandiu o espaço de endereços virtuais para 31 bits, e em 2000, a arquitetura 64-bit z/Architecture foi introduzida, com o espaço de endereços expandido para 64 bits; estes continuam a armazenar os bits acessados e sujos fora da tabela de páginas.
DEC AlphaEdit
O processador DEC Alpha divide a memória em 8 páginas KB. Após uma falta de TLB, o código da máquina de firmware de baixo nível (aqui chamado de PALcode) caminha para uma tabela de três níveis de páginas estruturadas em árvore. Os endereços são decompostos da seguinte forma: 21 bits não utilizados, 10 bits para indexar o nível da raiz da árvore, 10 bits para indexar o nível médio da árvore, 10 bits para indexar o nível da folha da árvore, e 13 bits que passam para o endereço físico sem modificação. São suportados bits de permissão de leitura/escrita/execução completa.
MIPSEdit
A arquitectura MIPS suporta uma a 64 entradas na TLB. O número de entradas na TLB é configurável na configuração da CPU antes da síntese. As entradas da TLB são duplas. Cada entrada da TLB mapeia um número de página virtual (VPN2) para um dos dois números de quadro de página (PFN0 ou PFN1), dependendo do bit menos significativo do endereço virtual que não faz parte da máscara de página. Este bit e os bits da máscara de página não são armazenados na VPN2. Cada entrada TLB tem seu próprio tamanho de página, que pode ser qualquer valor de 1 KB a 256 MB em múltiplos de quatro. Cada PFN em uma entrada TLB tem um atributo de cache, um bit sujo e um bit de status válido. Uma VPN2 tem um bit de status global e um ID de SO atribuído que participa na correspondência de entrada de TLB de endereço virtual, se o bit de status global for definido como zero. Um PFN armazena o endereço físico sem os bits da máscara de página.
Uma exceção de recarga da TLB é gerada quando não há entradas na TLB que correspondam ao endereço virtual mapeado. Uma exceção TLB inválida é gerada quando há uma correspondência, mas a entrada é marcada como inválida. Uma exceção modificada da TLB é gerada quando uma instrução da loja faz referência a um endereço mapeado e o status sujo da entrada correspondente não é definido. Se uma exceção TLB ocorrer ao processar uma exceção TLB, uma exceção TLB de dupla falha, ela é despachada para seu próprio manipulador de exceções.
MIPS32 e MIPS32r2 suportam 32 bits de espaço de endereço virtual e até 36 bits de espaço de endereço físico. MIPS64 suporta até 64 bits de espaço de endereço virtual e até 59 bits de espaço de endereço físico.
Sun 1Edit
O Sun 1 original é um computador de placa única construído em torno do microprocessador Motorola 68000 e introduzido em 1982. Ele inclui a unidade de gerenciamento de memória Sun 1 original que fornece tradução de endereços, proteção de memória, compartilhamento de memória e alocação de memória para múltiplos processos em execução na CPU. Todo o acesso da CPU à RAM privada on-board, memória Multibus externa, E/S on-board e E/S Multibus é executado através da MMU, onde a tradução de endereços e a proteção são feitas de maneira uniforme. A MMU é implementada em hardware na placa da CPU.
A MMU consiste num registo de contexto, num mapa de segmentos e num mapa de páginas. Os endereços virtuais da CPU são traduzidos em endereços intermediários pelo mapa de segmentos, que por sua vez são traduzidos em endereços físicos pelo mapa de páginas. O tamanho da página é de 2 KB e o tamanho do segmento é de 32 KB o que dá 16 páginas por segmento. Até 16 contextos podem ser mapeados concomitantemente. O espaço máximo de endereço lógico para um contexto é de 1024 páginas ou 2 MB. O endereço físico máximo que pode ser mapeado simultaneamente é também 2 MB.
O registro de contexto é importante em um sistema operacional multitarefa porque permite à CPU alternar entre processos sem recarregar toda a informação do estado da tradução. O registro de contexto de 4 bits pode alternar entre 16 seções do mapa de segmentos sob controle do supervisor, o que permite que 16 contextos sejam mapeados concomitantemente. Cada contexto tem o seu próprio espaço de endereços virtual. A partilha do espaço de endereçamento virtual e as comunicações entre contextos podem ser fornecidas escrevendo os mesmos valores nos mapas de segmentos ou páginas de diferentes contextos. Contextos adicionais podem ser tratados tratando o mapa de segmentos como um cache de contexto e substituindo contextos desatualizados em uma base menos usada recentemente.
O registro de contexto não faz distinção entre os estados de usuário e supervisor. Interrupções e armadilhas não mudam de contexto, o que requer que todos os vetores de interrupção válidos sejam sempre mapeados na página 0 do contexto, assim como a pilha de supervisor válida.
PowerPCEdit
No PowerPC as páginas G1, G2, G3, e G4 são normalmente de 4 KB. Após uma falta de TLB, a PowerPC MMU padrão inicia duas pesquisas simultâneas. Uma pesquisa tenta combinar o endereço com um de quatro ou oito registros de tradução de endereços de blocos de dados (DBAT), ou quatro ou oito registros de tradução de endereços de blocos de instruções (IBAT), conforme o caso. Os registros BAT podem mapear pedaços lineares de memória de até 256 MB, e são normalmente usados por um sistema operacional para mapear grandes porções do espaço de endereços para uso do próprio kernel do sistema operacional. Se a pesquisa de BAT tiver sucesso, a outra pesquisa é interrompida e ignorada.
A outra pesquisa, não suportada diretamente por todos os processadores desta família, é através da chamada “tabela de páginas invertidas”, que atua como uma extensão hashed off-chip da TLB. Primeiro, os quatro bits superiores do endereço são usados para selecionar um dos 16 registros de segmento. Depois, 24 bits do registro de segmento substituem esses quatro bits, produzindo um endereço de 52 bits. O uso de registros de segmento permite múltiplos processos para compartilhar a mesma tabela de hash.
O endereço de 52 bits é hashed, então usado como um índice na tabela off-chip. Lá, um grupo de entradas de oito páginas da tabela é escaneado para uma que corresponda. Se nenhuma corresponder devido a colisões excessivas de hash, o processador tenta novamente com uma função de hash ligeiramente diferente. Se isso também falhar, a CPU trava no SO (com MMU desabilitado) para que o problema possa ser resolvido. O sistema operacional precisa descartar uma entrada da tabela de hash para criar espaço para uma nova entrada. O sistema operacional pode gerar a nova entrada a partir de uma tabela de página mais normal como uma árvore ou a partir de estruturas de dados por mapeamento que provavelmente serão mais lentas e mais eficientes em termos de espaço. Suporte para controle sem exeção está nos registros de segmento, levando a granularidade de 256 MB.
Um grande problema com este projeto é a fraca localização de cache causada pela função hash. Projetos baseados em árvores evitam isso, colocando as entradas da tabela de páginas para páginas adjacentes em locais adjacentes. Um sistema operacional rodando no PowerPC pode minimizar o tamanho da tabela de hash para reduzir este problema.
É também um pouco lento remover as entradas da tabela de páginas de um processo. O sistema operacional pode evitar a reutilização de valores de segmentos para retardar o enfrentamento deste problema, ou pode optar por sofrer o desperdício de memória associado a tabelas de hash por processo. Os chips G1 não procuram por entradas de tabelas de páginas, mas eles geram o hash, com a expectativa de que um sistema operacional irá procurar a tabela de hash padrão via software. O sistema operacional pode escrever para a TLB. G2, G3 e chips G4 iniciais usam hardware para pesquisar a tabela de hash. Os chips mais recentes permitem que o SO escolha qualquer um dos métodos. Em chips que fazem isso opcional ou não suportam nada, o SO pode escolher usar uma tabela de páginas baseada em árvores exclusivamente.
IA-32 / x86Edit
A arquitetura x86 evoluiu por um longo tempo enquanto mantinha compatibilidade total com o software, mesmo para o código do SO. Assim, a MMU é extremamente complexa, com muitos modos de operação diferentes possíveis. O funcionamento normal da CPU tradicional 80386 e seus sucessores (IA-32) é descrito aqui.
A CPU divide principalmente a memória em 4 páginas KB. Os registros de segmento, fundamentais para os antigos projetos 8088 e 80286 MMU, não são usados nos sistemas operacionais modernos, com uma grande exceção: acesso a dados específicos de thread para aplicações ou dados específicos de CPU para kernels de sistemas operacionais, o que é feito com o uso explícito dos registros de segmento FS e GS. Todo acesso à memória envolve um registro de segmento, escolhido de acordo com o código que está sendo executado. O registro de segmento atua como um índice em uma tabela, que fornece um offset a ser adicionado ao endereço virtual. Exceto quando se utiliza FS ou GS, o SO garante que o offset será zero.
Após o offset ser adicionado, o endereço é mascarado para não ser maior que 32 bits. O resultado pode ser consultado através de uma tabela de páginas estruturadas em árvore, com os bits do endereço sendo divididos da seguinte forma: 10 bits para o ramo da árvore, 10 bits para as folhas do ramo, e os 12 bits mais baixos sendo copiados diretamente para o resultado. Alguns sistemas operacionais, como o OpenBSD com seu recurso W^X, e Linux com o Exec Shield ou patches PaX, também podem limitar o comprimento do segmento de código, como especificado pelo registro CS, para proibir a execução do código em regiões modificáveis do espaço de endereços.
Revisões menores da MMU introduzidas com o Pentium permitiram páginas muito grandes de 4 MB pulando o nível inferior da árvore (isto deixa 10 bits para indexar o primeiro nível da hierarquia de páginas com os 10+12 bits restantes sendo copiados diretamente para o resultado). Pequenas revisões da MMU introduzidas com o Pentium Pro introduziram o recurso de extensão de endereço físico (PAE), permitindo endereços físicos de 36 bits com 2+9+9 bits para tabelas de três níveis de páginas e 12 bits mais baixos sendo copiados diretamente para o resultado. Páginas grandes (2 MB) também estão disponíveis pulando o nível inferior da árvore (resultando em 2+9 bits para tabelas de dois níveis hierárquicos e os 9+12 bits mais baixos restantes sendo copiados diretamente). Além disso, a tabela de atributos da página permitiu a especificação da capacidade de cache procurando alguns bits altos em uma pequena tabela na CPU.
No-execute suporte foi originalmente fornecido apenas em uma base por segmento, tornando-o muito difícil de usar. Os chips x86 mais recentes fornecem um bit nãoexecutado por página no modo PAE. Os mecanismos W^X, Exec Shield e PaX descritos acima emulam o suporte não-executado por página em processadores x86 sem o bit NX definindo o comprimento do segmento de código, com uma perda de performance e uma redução no espaço de endereço disponível.
x86-64Editar
x86-64 é uma extensão de 64 bits do x86 que remove quase totalmente a segmentação em favor do modelo de memória plana utilizado por quase todos os sistemas operacionais para os processadores 386 ou mais recentes. No modo longo, todos os offsets de segmento são ignorados, exceto para os segmentos FS e GS. Quando usado com 4 páginas KB, a árvore de tabela de páginas tem quatro níveis em vez de três.
Os endereços virtuais são divididos da seguinte forma: 16 bits não utilizados, nove bits cada para quatro níveis de árvore (para um total de 36 bits), e os 12 bits mais baixos copiados diretamente para o resultado. Com 2 MB de páginas, há apenas três níveis de tabela de páginas, para um total de 27 bits usados em paginação e 21 bits de offset. Algumas CPUs mais recentes também suportam uma página de 1 GB com dois níveis de paginação e 30 bits de offset.
CPUID pode ser usado para determinar se 1 GB de páginas são suportadas. Nos três casos, os 16 bits mais altos devem ser iguais aos 48 bits ou, em outras palavras, os 48 bits mais baixos são estendidos para os bits mais altos. Isto é feito para permitir uma futura expansão da faixa endereçável, sem comprometer a compatibilidade com o passado. Em todos os níveis da tabela de páginas, a entrada da tabela de páginas inclui um bit não exato.
Sistemas Unisys MCP (Burroughs B5000)Edit
O Burroughs B5000 de 1961 foi o primeiro sistema comercial a suportar memória virtual (depois do Atlas), apesar de não possuir uma MMU. Fornece as duas funções de uma MMU – endereços de memória virtual e proteção de memória – com uma abordagem arquitetônica diferente.
Primeiro, no mapeamento de endereços de memória virtual, ao invés de precisar de uma MMU, os sistemas MCP são baseados em descritores. Cada bloco de memória alocado recebe um descritor mestre com as propriedades do bloco (ou seja, o tamanho, endereço e se está presente na memória). Quando é feito um pedido de acesso ao bloco para leitura ou escrita, o hardware verifica sua presença através do bit de presença (pbit) no descritor.
Um pbit de 1 indica a presença do bloco. Neste caso, o bloco pode ser acessado através do endereço físico no descritor. Se o pbit é zero, se gera uma interrupção para que o MCP (sistema operativo) faça presente o bloco. Se o campo de endereço é zero, este é o primeiro acesso a este bloco, e o mesmo é alocado (um pbit init). Se o campo de endereço não é zero, é um endereço de disco do bloco, o qual foi previamente desenrolado, portanto o bloco é buscado do disco e o pbit é ajustado a um e o endereço da memória física é atualizado para apontar para o bloco na memória (outro pbit). Isto faz com que os descritores sejam equivalentes a uma entrada de page-table em um sistema MMU. O desempenho do sistema pode ser monitorado através do número de pbits. Os pbits de inicialização indicam alocações iniciais, mas um alto nível de outros pbits indica que o sistema pode estar com thrashing.
Toda alocação de memória é portanto completamente automática (uma das características dos sistemas modernos) e não há maneira de alocar blocos a não ser este mecanismo. Não existem chamadas como malloc ou dealloc, já que os blocos de memória também são automaticamente descartados. O esquema também é preguiçoso, uma vez que um bloco não será alocado até que seja realmente referenciado. Quando a memória está quase cheia, o MCP examina o conjunto de trabalho, tentando compactação (já que o sistema é segmentado, não paginado), desalocando segmentos somente leitura (como segmentos de código que podem ser restaurados de sua cópia original) e, como último recurso, rolando segmentos de dados sujos para fora do disco.
Outra forma o B5000 fornece uma função de uma MMU está em proteção. Como todos os acessos são feitos através do descritor, o hardware pode verificar se todos os acessos estão dentro dos limites e, no caso de uma escrita, se o processo tem permissão de escrita. O sistema MCP é inerentemente seguro e, portanto, não tem necessidade de uma MMU para fornecer este nível de proteção de memória. Os descritores são lidos apenas para processos do usuário e só podem ser atualizados pelo sistema (hardware ou MCP). (Palavras cuja tag é um número ímpar são somente leitura; descritores têm uma tag de 5 e palavras de código têm uma tag de 3.)
Blocks podem ser compartilhados entre processos através de descritores de cópia na pilha de processos. Assim, alguns processos podem ter permissão de escrita, enquanto outros não têm. Um segmento de código é somente de leitura, portanto reentrante e compartilhado entre os processos. Os descritores de cópia contêm um campo de endereço de 20 bits dando índice do descritor mestre na matriz do descritor mestre. Isto também implementa um mecanismo de IPC muito eficiente e seguro. Os blocos podem ser facilmente realocados, uma vez que apenas o descritor mestre precisa ser atualizado quando o status de um bloco muda.
O único outro aspecto é o desempenho – os sistemas baseados ou não em MMU fornecem melhor desempenho? Sistemas MCP podem ser implementados em cima de hardware padrão que tem uma MMU (por exemplo, um PC padrão). Mesmo que a implementação do sistema utilize a MMU de alguma forma, isto não será de todo visível ao nível do MCP.