O que são memória alta e pouca memória no Linux?

89

Estou interessado na diferença entre Highmem e Lowmem:

  1. Por que existe essa diferenciação?
  2. O que ganhamos fazendo isso?
  3. Quais recursos cada um tem?
por Sen 17.12.2010 / 10:59

6 respostas

62

Em uma arquitetura de 32 bits, o intervalo de espaço de endereçamento para endereçar RAM é:

0x00000000 - 0xffffffff

ou 4'294'967'295 (4 GB).

O kernel do linux divide em até 3/1 (também pode ser 2/2, ou 1/3 1 ) no espaço do usuário (alta memória) e no espaço do kernel (pouca memória), respectivamente. / p>

O intervalo de espaço do usuário:

0x00000000 - 0xbfffffff

Todo processo de usuário recém gerado gera um endereço (intervalo) dentro dessa área. Os processos do usuário geralmente não são confiáveis e, portanto, são proibidos de acessar o espaço do kernel. Além disso, eles são considerados não urgentes, como regra geral, o kernel tenta adiar a alocação de memória para esses processos.

O intervalo de espaço do kernel:

0xc0000000 - 0xffffffff

Um processo do kernel obtém seu endereço (intervalo) aqui. O kernel pode acessar diretamente este 1 GB de endereços (bem, não o total de 1 GB, há 128 MB reservados para acesso a memória alta).

Processos gerados no espaço do kernel são confiáveis, urgentes e presumidos sem erros, a solicitação de memória é processada instantaneamente.

Todo processo do kernel também pode acessar o intervalo de espaço do usuário, se desejar. E para conseguir isso, o kernel mapeia um endereço do espaço do usuário (a memória alta) para o espaço do kernel (a memória baixa), os 128 MB mencionados acima são especialmente reservados para isso.

1 Se a divisão é 3/1, 2/2 ou 1/3 é controlada pela opção CONFIG_VMSPLIT_... ; provavelmente você pode verificar em /boot/config* para ver qual opção foi selecionada para o seu kernel.

    
por 26.12.2010 / 17:09
27

A primeira referência a ser feita é Linux Device Drivers (disponível online e no formato de livro), especialmente capítulo 15 que tem uma seção sobre o tópico.

Em um mundo ideal, cada componente do sistema seria capaz de mapear toda a memória que precisa acessar. E esse é o caso dos processos no Linux e na maioria dos sistemas operacionais: um processo de 32 bits só pode acessar um pouco menos que 2 ^ 32 bytes de memória virtual (na verdade, cerca de 3 GB em uma arquitetura Linux típica de 32 bits). É difícil para o kernel, que precisa ser capaz de mapear a memória completa do processo cujo sistema está sendo executado, além de toda a memória física, além de qualquer outro dispositivo de hardware mapeado por memória.

Assim, quando um kernel de 32 bits precisa mapear mais de 4 GB de memória, ele deve ser compilado com alto suporte de memória. Memória alta é a memória que não é permanentemente mapeada no espaço de endereço do kernel. (Pouca memória é o oposto: é sempre mapeada, então você pode acessá-la no kernel simplesmente desreferenciando um ponteiro.)

Quando você acessa memória alta a partir do código do kernel, é necessário chamar kmap primeiro para obter um ponteiro de uma estrutura de dados da página ( struct page ). Chamar kmap funciona se a página está com memória alta ou baixa. Há também kmap_atomic que adicionou restrições, mas é mais eficiente em máquinas com multiprocessadores porque usa travamento com granularidade mais fina. O ponteiro obtido através de kmap é um recurso: ele usa o espaço de endereço. Depois de terminar, você deve chamar kunmap (ou kunmap_atomic ) para liberar esse recurso; então o ponteiro não é mais válido, e o conteúdo da página não pode ser acessado até você chamar kmap novamente.

    
por 17.12.2010 / 21:55
16

Isso é relevante para o kernel do Linux; Não tenho certeza de como qualquer kernel Unix manipula isso.

A memória alta é o segmento de memória que os programas do espaço do usuário podem endereçar. Não pode tocar em pouca memória.

Low Memory é o segmento de memória que o kernel do Linux pode endereçar diretamente. Se o kernel deve acessar High Memory, ele precisa mapeá-lo em seu próprio espaço de endereço primeiro.

Houve um patch introduzido recentemente que permite controlar onde o segmento está. A desvantagem é que você pode tirar a memória endereçável do espaço do usuário para que o kernel possa ter mais memória que não precisa mapear antes de usar.

Recursos adicionais:

por 17.12.2010 / 13:58
4

HIGHMEM é um intervalo de espaço de memória do kernel, mas NÃO é memória acessada, mas é um lugar onde você coloca o que deseja acessar.

Um típico mapa de memória virtual Linux de 32 bits é como:

  • 0x00000000-0xbfffffff: processo do usuário (3 GB)

  • 0xc0000000-0xffffffff: espaço do kernel (1 GB)

(vetor específico da CPU e qualquer que seja ignorado aqui).

O Linux divide o espaço do kernel de 1 GB em 2 partes, LOWMEM e HIGHMEM. A divisão varia de instalação para instalação.

Se uma instalação escolher, digamos, 512MB-512MB para LOW e HIGH mems, o LOWMEM de 512MB (0xc0000000-0xdfffffff) é mapeado estaticamente no momento da inicialização do kernel; geralmente os primeiros bytes da memória física são usados para isso, de modo que os endereços virtuais e físicos nesse intervalo tenham um deslocamento constante de, digamos, 0xc0000000.

Por outro lado, os últimos 512MB (HIGHMEM) não possuem mapeamento estático (embora você possa deixar páginas semi-permanentemente mapeadas lá, mas você deve fazê-lo explicitamente no seu código de driver). Em vez disso, as páginas são temporariamente mapeadas e não mapeadas para que os endereços virtuais e físicos nesse intervalo não tenham mapeamento consistente. Usos típicos do HIGHMEM incluem buffers de dados em tempo único.

    
por 29.01.2013 / 21:04
3

Tanto quanto me lembro, "High Memory" é usado para o espaço do aplicativo e "Low Memory" para o kernel.

A vantagem é que os aplicativos (espaço do usuário) não podem acessar a memória do espaço do kernel.

    
por 17.12.2010 / 12:00
0

Muitas pessoas disseram que a pouca memória é para o sistema operacional. Isso geralmente é verdade, mas não precisa ser. Alta memória e pouca memória são apenas duas partes do espaço de memória, mas no sistema Linux a pouca memória é apenas para o kernel e alta memória para processos do usuário.

De acordo com o "Livro dos dinossauros (conceitos do sistema operacional)", podemos colocar o sistema operacional em pouca memória ou alta memória. O principal fator que afeta essa decisão é a localização do vetor de interrupção. Como o vetor de interrupção geralmente está com pouca memória, os programadores geralmente colocam o sistema operacional com pouca memória também.

    
por 12.10.2016 / 19:08