Alocação máxima de memória para o kernel do 32bit linux

4

Eu estava lendo este artigo que fala sobre como a quantidade máxima de RAM dedicada para uso do kernel em janelas de 32 bits é de 2 GB, mesmo quando a quantidade total de RAM é de > 4 GB.

link \

  1. É o mesmo para ambientes Linux de 32 bits, como o ubuntu de 32 bits 10,04? IE é o máximo de 2GB de alocação de kernel ram mesmo que a memória principal total > 4GB?

  2. Se você aumentar a quantidade total de memória para 64 GB de RAM recompilação do kernel com a opção PAE ativada, qual é a quantidade máxima de memória ram que você pode dedicar para uso do kernel? É isso ainda 2GB? Ou você pode aumentá-lo?

por user784637 15.11.2011 / 06:35

3 respostas

6

Ambos os kernels dividem o espaço de endereçamento virtual em uma parte do usuário e uma parte do kernel. A parte do kernel é compartilhada entre todos os processos no sistema e, portanto, o kernel é limitado a essa quantidade de memória diretamente endereçável. Cada processo do usuário no sistema possui sua própria parte do usuário do espaço de endereço. Classicamente esta divisão foi feita no meio, dando a cada metade 2gb. O Windows pode ser direcionado para mover a divisão para 3gb para usuário e 1gb para kernel com o parâmetro / 3gb boot.ini. O kernel do Linux é bastante configurável em tempo de compilação e, pela última vez que verifiquei, os kernels do Ubuntu constroem com a divisão 3: 1.

O PAE permite que 64 GB de RAM física sejam endereçados, mas qualquer tabela de páginas fornecida ainda é limitada a 4 GB. Como há apenas uma parte do kernel desse espaço de endereço compartilhado entre todos os processos no sistema, ele é limitado a 1 ou 2 GB de memória RAM diretamente endereçável, não importa o quê. Memória física adicional pode ser usada, mas deve ser mapeada apenas parcialmente no espaço de endereço virtual a qualquer momento, e os mapeamentos são alterados quando necessário. Como cada processo tem um espaço de endereço de usuário separado, você pode ter, por exemplo, 5 processos diferentes, cada um com 2 gb de memória própria, que mapeia para diferentes partes de 16 gb de memória física instalada e o kernel usando outros 2 gb. / p>

Note que o cache do sistema de arquivos não precisa manter as páginas mapeadas o tempo todo, então ele pode usar muito mais do que o físico, e o kernel automaticamente mapeia pedaços quando necessário, então desmata para mapear outras páginas . Esse truque permite ao kernel usar muitos gb de memória para o cache, e algumas centenas de mb para outros usos, mesmo quando o kernel tem apenas 1gb de espaço de endereçamento virtual para brincar.

Vale notar também que em versões recentes do Windows, a Microsoft instituiu várias limitações de licenciamento de produtos artificiais. O Windows 7 Pro eu estou preso no meu PC no trabalho se recusa a usar endereços de memória física > 4gb, mesmo se eu ativar o PAE, o que resulta em apenas ser capaz de usar 3,4 dos 4,0 GB de RAM instalados, já que um pedaço do RAM é realocado na marca de 4GB para deixar espaço para coisas como o vídeo ser localizado sob 4 gb.

    
por 19.11.2011 / 03:39
1

Normalmente, o motivo pelo qual as janelas não podem alocar toda a memória é porque parte desse espaço de memória é usado para o RAM de Vídeo.

Quanto à sua pergunta sobre o PAE, não tenho certeza. Se você tivesse 64 GB de RAM e PAE, provavelmente poderia usar mais de 4 GB no total, mas acho que cada programa individual seria limitado a 4 GB de RAM.

Esse problema vem do espaço de endereço fornecido por um inteiro de 32 bits. 2 ^ 32 fornece valores 4294967295, portanto, limite de RAM de 4 gig.

    
por 15.11.2011 / 07:03
0

De acordo com este texto , o Linux se divide em 3G, então é suposto que você tenha acesso a 3G de RAM de uma vez, como acontece com o Windows com a opção / 3GB aplicada ao boot.ini .

Pelo menos, em teoria. Devido a algum motivo desconhecido para mim, um teste só provou que eu só posso usar uma parte desta memória:

08048000-0804b000 data?
0804b000-081ce000 heap
65e00000-b7395000 mmap-ed heap
b7395000-b73ac000 mmap-ed code
bf93f000-bf960000 stack

Por que não consegui malloc() do intervalo de 081ce000-65e00000 , não sei.

    
por 15.11.2011 / 09:29