O que aconteceu com minha RAM?

6

Estou tentando entender o básico do sistema operacional Linux. Estou executando o Ubuntu 12.04 de 64 bits em uma CPU de 64 bits. O sistema tem 2GB de RAM.

cat /proc/meminfo 
MemTotal:        2012040 kB

Pergunta 1 : Onde estão faltando 85112 KB de RAM?

2097152 (2 gb in kilobytes)
2012040 -
______________
 85112

Isso é reservado para outra coisa ou é uma limitação de hardware que o sistema não pode usar 4% da RAM?

Pergunta 2 : Minha leitura inicial me diz que há uma divisão 3: 1 para o espaço do kernel do usuário. Por que esse não é o caso aqui?

(3/4)*2097152 =1572864 for user space
(1/4)*2097152 =524288  for kernel space

Estou ciente dos caches e buffers RAM do Linux (gastei algum esforço de pesquisa para entender isso, pelo menos), mas neste caso não tem nada a ver com isso, então o que está acontecendo?

    
por learner 19.06.2013 / 17:06

2 respostas

9

Você realmente não deveria fazer duas perguntas em uma, mas ...

Questão 1

Parte dessa memória é usada para o código do kernel em si, alguns são reservados, etc. O kernel mostra as mensagens de inicialização do sistema:

[    0.000000] Memory: 6106920k/7340032k available (3633k kernel code, 1057736k absent, 175376k reserved, 3104k data, 616k init)

A linha "ausente" é a memória que não está lá (atualmente, esta máquina tem 6GiB de RAM instalada). O kernel também mostra o mapa da memória (isso é anterior nas mensagens de inicialização):

[    0.000000] e820: BIOS-provided physical RAM map:
[    0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000009ebff] usable
[    0.000000] BIOS-e820: [mem 0x000000000009ec00-0x000000000009ffff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000000e2c00-0x00000000000fffff] reserved
[    0.000000] BIOS-e820: [mem 0x0000000000100000-0x00000000bf77ffff] usable
[    0.000000] BIOS-e820: [mem 0x00000000bf780000-0x00000000bf797fff] ACPI data
[    0.000000] BIOS-e820: [mem 0x00000000bf798000-0x00000000bf7d9fff] ACPI NVS
[    0.000000] BIOS-e820: [mem 0x00000000bf7da000-0x00000000bfffffff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000fee00000-0x00000000fee00fff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000ffe00000-0x00000000ffffffff] reserved
[    0.000000] BIOS-e820: [mem 0x0000000100000000-0x00000001bfffffff] usable

O kernel então faz várias correções nesse mapa, geralmente reservando mais memória. Especialmente quando os drivers carregam.

Questão 2

A divisão kernel / user é de espaço de endereço virtual , não de memória. É praticamente irrelevante em uma caixa de 64 bits, porque há muito espaço para endereçamento.

Em uma caixa de 32 bits, os endereços virtuais 0x00000000–0xBFFFFFFF foram usados para o espaço de endereço do usuário. 0xC0000000–0xFFFFFFFF foram usados pelo kernel (essa é a divisão de 3: 1, outras opções incluíram uma divisão de 2: 2. Note que esses números são gigabytes, então é 2: 2 não 1: 1). Os endereços virtuais também são específicos do processo (cada processo pode ter uma página em 0x00001000 e é uma página diferente).

Mas um endereço virtual não corresponde a um byte de memória. Pode ser apoiado basicamente por quatro coisas:

  1. Nada. A página não está em uso. Tente acessá-lo, pegue um segfault.
  2. RAM física. A MMU traduz o endereço virtual para algum endereço físico, que na verdade corresponde a capacitores em um DIMM em algum lugar.
  3. Trocar (ou arquivo mapeado na memória). Se você acessar isto, haverá uma falha na página, e o kernel suspenderá seu processo enquanto lê os dados na memória (e possivelmente grava outros dados no disco, para liberar espaço). Em seguida, o kernel atualiza as tabelas de páginas, transformando isso no caso # 2.
  4. página zero. Esta é uma página recém-alocada, que ainda não foi usada. Quando estiver, o kernel encontrará uma página de memória física (possivelmente trocando outras coisas), preenchendo-a com zeros (por segurança), e então é o caso nº 2.

Páginas enormes e transparentes criam mais casos. Há provavelmente alguns menos importantes que eu também esqueci ...

De qualquer forma, meu chip de 64 bits tem um tamanho de endereço virtual de 48 bits. Não tenho certeza de qual divisão o kernel usa, mas mesmo que seja a metade, são 47 bits de espaço, bem acima do tamanho do endereço físico de 36 bits. E 131.072 GiB de RAM é muito caro ... (E, lembre-se, quando fica mais barato, há muitos bits restantes em 64, processadores futuros provavelmente só permitirão mais deles).

    
por 19.06.2013 / 18:03
3

As reservas de hardware ocupam uma pequena quantidade de RAM, especialmente se você tiver uma placa de vídeo onboard que use alguma RAM para suas próprias operações. Isso acontece com todos os sistemas operacionais.

    
por 19.06.2013 / 17:19

Tags