como o tamanho da página é determinado no espaço de endereço virtual?


43

O Linux usa um sistema de memória virtual em que todos os endereços são endereços virtuais e não físicos. Esses endereços virtuais são convertidos em endereços físicos pelo processador.

Para facilitar essa tradução, a memória virtual e física é dividida em páginas. Cada uma dessas páginas recebe um número único; o número do quadro da página.

Alguns tamanhos de página podem ter 2 KB, 4 KB, etc. Mas como é determinado o número do tamanho da página? É influenciado pelo tamanho da arquitetura? Por exemplo, um barramento de 32 bits terá 4 GB de espaço de endereço.

Respostas:


56

Você pode descobrir o tamanho da página padrão do sistema consultando sua configuração através do getconfcomando:

$ getconf PAGE_SIZE
4096

ou

$ getconf PAGESIZE
4096

NOTA: As unidades acima são tipicamente em bytes; portanto, o 4096 equivale a 4096 bytes ou 4kB.

Isso está conectado na fonte do kernel Linux aqui:

Exemplo

$ more /usr/src/kernels/3.13.9-100.fc19.x86_64/include/asm-generic/page.h
...
...
/* PAGE_SHIFT determines the page size */

#define PAGE_SHIFT  12
#ifdef __ASSEMBLY__
#define PAGE_SIZE   (1 << PAGE_SHIFT)
#else
#define PAGE_SIZE   (1UL << PAGE_SHIFT)
#endif
#define PAGE_MASK   (~(PAGE_SIZE-1))

Como a mudança lhe dá 4096?

Quando você muda os bits, realiza uma multiplicação binária por 2. Portanto, na verdade, uma mudança de bits para a esquerda ( 1 << PAGE_SHIFT) faz a multiplicação de 2 ^ 12 = 4096.

$ echo "2^12" | bc
4096

2
O hardware moderno suporta tamanhos de páginas de 2 MB e 1 GB. "PAGE_SHIFT" pode ser definido como 21 para páginas de 2 MB como o padrão para a compilação do kernel?
ReverseFlow 11/04

2
@ ReverseFlow Para que isso seja respondido, eu faria uma pergunta separada.
22418 Kirill Bulygin

@ Sim, querendo saber por que as manipulações de bits são usadas aqui? Eu li que o compilador geralmente converte multiplicações em manipulações de bits, fornecendo o mesmo desempenho.
InAFlash

17

O hardware (especificamente, o MMU , que faz parte da CPU) determina quais tamanhos de página são possíveis. Não há relação com o tamanho do registro do processador e apenas uma relação indireta com o tamanho do espaço de endereço (na medida em que a MMU determina ambos).

Quase todas as arquiteturas suportam um tamanho de página de 4kB. Algumas arquiteturas suportam páginas maiores (e algumas também suportam páginas menores), mas 4kB é um padrão muito difundido.

O Linux suporta dois tamanhos de página:

  • Páginas de tamanho normal, que acredito serem 4kB por padrão em todas as arquiteturas, embora algumas arquiteturas permitam outros valores, por exemplo, 16kB no ARM64 ou 8kB, 16kB ou 64kB no IA64 . Eles correspondem ao nível mais profundo de descritores na MMU (o que o Linux chama de PTE ).
  • Páginas enormes , se compiladas ( CONFIG_HUGETLB_PAGEé necessário e CONFIG_HUGETLBFStambém para a maioria dos usos). Isso corresponde ao segundo nível mais profundo dos descritores da MMU (o que o Linux chama de PMD) (ou pelo menos costuma fazer, não sei se isso vale para todas as arquiteturas).

O tamanho da página é um compromisso entre o uso da memória, o uso da memória e a velocidade.

  • Um tamanho de página maior significa mais desperdício quando uma página é usada parcialmente, para que o sistema fique sem memória mais cedo.
  • Um nível mais profundo de descritor de MMU significa mais memória do kernel para tabelas de páginas.
  • Um nível mais profundo de descritor de MMU significa mais tempo gasto no percurso da tabela de páginas.

Os ganhos de tamanhos maiores de página são pequenos para a maioria dos aplicativos, enquanto o custo é substancial. É por isso que a maioria dos sistemas usa apenas páginas de tamanho normal.

Você pode consultar o tamanho da página (normal) no seu sistema com a getconfutilidade ou a função C sysconf.

$ getconf PAGE_SIZE
4096

Usar páginas enormes exige a montagem do hugetlbfssistema de arquivos e os arquivos mmapping lá.


FYI: Usar páginas grandes não requer montagem hugetlbfs, pois o documento do kernel observa na parte inferior você também pode usar chamadas de memória compartilhada ou um sinalizador mmap. Além disso, o mais interessante é que você pode ativar páginas enormes e transparentes, e o kernel converterá automaticamente páginas normais em páginas enormes, sempre que possível em todos os aplicativos.
Derobert

Esta é a resposta verdadeiramente fundamental. O Linux foi projetado apenas para usar bem o hardware de paginação. Mais detalhes sobre paginação: stackoverflow.com/questions/18431261/how-does-x86-paging-work
Ciro Santilli新疆改造中心法轮功六四事件

0

O tamanho da página depende principalmente da arquitetura do processador. No x86, desde os tempos do processador 386 que introduziu o modo protegido, o tamanho da página foi de 4 kB.

No modo x64, também pode haver páginas enormes, com tamanho de 2 MB. No entanto, usá-los é um pouco complicado.

Você pode encontrar mais informações sobre o tamanho da página no artigo da Wikipedia


0

O processador determina os tamanhos de página disponíveis. Para a maioria das finalidades, o tamanho da página implementada por hardware nos processadores x86 e x86_64 é de 4kb. No entanto, o sistema operacional pode alocar mais de uma página por vez, se desejar, e assim implementar efetivamente páginas de 8kb, 16kb ou 32kb no software.

Os processadores x86 e x86_64 podem, respectivamente, também misturar páginas de 4mb e 2mb com as páginas padrão de 4kb. Se esse recurso for usado, seria usado principalmente para alocar espaço no kernel.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.