Paginação no modo x86-64

Tá lá no meu livro, mas gosto sempre de mostrar/aprender alguma coisa sob várias perspectivas…

No último post falei um cadinho sobre paginação no modo i386 e só falei da paginação tradicional. Mesmo neste modo existem extensões que podem aumentar o tamanho de uma página (PAE) ou aumentarem a quantidade de memória endereçável (PSE). A distinção é sutil: No modo i386 o endereço linear tem sempre 32 bits de tamanho, mas na extensão PSE uma página pode ser localizada no espaço físico usando um endereço físico de até 36 bits (4 bits adicionais). Daí, ao invés de acessar apenas 4 GB de memória, podemos ter acesso a 64 GB. A diferença entre a extensão PSE e PAE é que a última permite que uma página tenha mais que 4 kB de tamanho.

Ambas as extensões podem ser usadas em conjunto… PSE funciona eliminando a tabela seguinte, aumentando a quantidade de bits no offset do endereço linear. No caso do modo i386, é possível elimiar a tabela PT e deixamos apenas a PDT:

page_pae

Para isso funcionar o registrador de controle CR4 precisa ter o bit PSE (Page Size Enabled ou Extension) habilitado e a entrada PDE precisa ter o bit PS setado. Isso permite que possamos misturar páginas de 4 kB e paginas de 4 MB numa mesma estrutura de árvore, o que dá uma confusão dos diabos porque podemos ter páginas sobrepostas. É por isso que essa extensão é evitada… Mas, às vezes, é útil: No caso de um kernel, por exemplo, podemos estipula que uma página de 4 MB será dedicada apenas para o código (ou dados) do kernel e manter uma única entrada na PDE, fixa…

A extensão PAE é mais complicada… No modo i386, ao invés de termos apenas 2 tabelas (PDT e PT) temos uma terceira, a PDPT (Page Directory Pointer Table) que tem apenas 4 entradas. As outras duas passam a ter 512 entradas e todas as tabelas passam a ter endereços físicos base de 36 bits. Note que o endereço linear continua tendo 32, mas, agora, a página pode estar localizada em qualquer lugar no espaço físico de 64 GB.

Da mesma forma que o PSE, o PAE precisa ser habilitado no registrador CR4, mas não tem bit de habilitação nas entradas de página… E, é claro, que já que temos apenas 512 entradas, cada entrada das tabelas agora tem 64 bits de tamanho, e os campos do endereço linear passam a ter 9 bits (exceto PDPT, que tem 2). Continuamos com 12 bits de offset para páginas de 4 kB… Se habilitarmos o PSE apenas a PT pode ser descartada e passaremos a ter páginas de 2 MB (9 bits da PT que serão agregado aos 12 do offset).

No modo x86-64 PAE é obrigatório porque todas as entradas das tabelas têm que ter 64 bits de tamanho, mas uma tabela é adicionada na hierarquia. Ela é chamada de PML4 (Page Map Level 4) e todas as 4 tabelas têm 512 entradas e, portanto, 9 bits no endereço linear:

p4ml

Embora o PAE seja obrigatório, o PSE não é, mas ainda pode ser usado e é um cadinho estendido: Podemos eliminar a PT e também a PDT, se quisermos, com o bit PS nas entradas de PDT e PDPT, respectivamente. Com isso podemos ter páginas de 4 kB, 2 MB ou 1 GB. De novo, é claro, se o registrador de controle CR4 permitir!

Só para constar: Nunca vi ninguém usando páginas de 1 GB!

E é interessante notar: O endereço linear tem 48 bits de tamanho, não 64! Os 16 bits superiores têm que ser uma cópia do bit 47 sempre, se você não quer tomar um segmentation fault ou um general protection fault na cara! O que não é, ainda, muito claro para mim é se o processador encada esse valor como um “endereço negativo” em complemento 2. Mas isso é de pouca importância prática, já que não deve ser de grande preocupação. Com 48 bits de endereço linear podemos endereçar até 256 TB de memória… Mesmos nos computadores mais novinhos essa é uma quantidade astronômica de memória (até mesmo com o mecanismo de swapping).

Anúncios

Deixe um comentário

Faça o login usando um destes métodos para comentar:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s