ZONE_NORMAL e sua associação com o Kernel / User-pages?

5

Acima é apresentado um caso em que tenho apenas 512 MB de memória física. O que eu tenho lido até agora, é que ZONE_NORMAL é mapeado para o espaço de endereço virtual do kernel, como mostrado. Essencialmente eu tenho uma memória física de 512 MB, dos quais 496 MB de ZONE_NORMAL são mapeados para o espaço virtual do kernel. Com base nesse entendimento, segue minha pergunta:

  • O ZONE_NORMAL consiste em páginas de espaço do kernel somente ?
  • Se ZONE_NORMAL consistir apenas em páginas do kernel e for mapeado completamente para o intervalo de endereços virtuais do espaço do kernel, onde as páginas do espaço do usuário serão localizadas ?? Não parece haver espaço para páginas de espaço do usuário na memória física.

Estou totalmente confuso no caso em que a memória física é menor que 4GB, como mostrado neste caso que eu apresentei.

Eu realmente aprecio se alguém puder esclarecer isso.

    
por TheLoneJoker 26.12.2010 / 02:37

2 respostas

3

Em uma arquitetura de 32 bits, você tem% de endereços lineares0xffffffff ( 4'294'967'295 ou 4 GB) (não espaço físico) para se referir a um endereço físico.
Mesmo com apenas 512 MB de armazenamento físico (a memória RAM real conectada ao barramento), o kernel ainda usará endereços linear 4'294'967'295 (4 GB) para calcular os físicos.

O kernel linux divide esses 4 GB (de endereços) no espaço do usuário (alta memória) e o espaço do kernel (pouca memória) em 3/1, então o espaço do kernel tem 1'073'741'823 (1 GB) de endereços lineares para usar.

Esses 1 GB de endereços lineares só são acessíveis pelo kernel e estão sendo divididos ainda mais.

ZONE_DMA : contém quadros de página de memória abaixo de 16 MB. Isso é usado para os barramentos ISA antigos, eles são capazes de endereçar apenas os primeiros 16 MB de RAM.

ZONE_NORMAL : Contém quadros de página de memória de até 16 MB e abaixo de 896 MB, estes são os endereços que o kernel pode mapear / acessar diretamente.

ZONE_HIGHMEM : Contém quadros de página de memória com 896 MB ou mais, quadros de página acima dessa borda geralmente não são mapeados para o espaço do kernel e, portanto, não são acessíveis diretamente pelo kernel. Quadros de páginas do espaço do usuário podem ser mapeados temporária ou permanentemente aqui.

O espaço real da RAM física ocupado pelas diferentes zonas depende da forma e do número de processos que você executa.

Se você inserir free -ml no seu console, poderá ver o uso incluindo memória baixa e alta:

             total       used       free     shared    buffers     cached
Mem:          3022       2116        905          0        105       1342
Low:           839        196        642
High:         2182       1919        263
-/+ buffers/cache:        667       2354
Swap:         2859         93       2766
    
por 26.12.2010 / 19:43
1

A mesma página física pode ser mapeada para mais de um endereço virtual.

ZONE_NORMAL consiste em páginas que podem ser mapeadas pelo kernel. A maior parte dessa memória não pertence ao kernel, mas o kernel precisa mapear toda a memória em algum ponto (não necessariamente tudo ao mesmo tempo). Por exemplo, quando o kernel está processando uma chamada de sistema write , ele precisa copiar os dados do buffer fornecido pelo usuário, o que significa que o buffer deve ser mapeado no espaço de endereço virtual do kernel.

O diagrama descreve a situação (relativamente) simples sem memória alta. (Se você trabalha com dispositivos ARM high-end, agora é a hora de começar a aprender sobre memória alta.) Então o kernel pode mapear toda a memória do processo e toda a memória física ao mesmo tempo.

Aqui está um exemplo de partição de memória virtual como visto pelo código do kernel (não tenho certeza se os números exatos são possíveis, mas a idéia básica deve estar certa). Ou seja, estou descrevendo o significado de um ponteiro usado pelo código do kernel.

  • 0x00000000..0x00000fff : não alocado. Um ponteiro neste intervalo é inválido.
  • 0x00001000..0xbfffffff : memória do processo. Esse é um ponteiro para o espaço de endereço virtual do processo em que o código do kernel em questão está processando uma chamada do sistema. Uma página nesse intervalo pode ser não alocada, ou pode ser alocada e trocada (nesse caso, também tem um endereço físico), ou pode ser alocada e trocada (caso em que não tem um endereço físico em RAM, mas tem uma localização na troca).
  • 0xc0000000..0xdfffffff : memória física. Um ponteiro nesse intervalo representa o endereço físico p-0xc0000000. A interpretação deste ponteiro não depende realmente da MMU.
  • 0xe0000000..0xffefffff : não alocado. Um ponteiro neste intervalo é inválido.
  • 0xff000000..0xffffffff : memória do kernel. Este é um ponteiro para o código ou dados do kernel. Uma página nesse intervalo tem um endereço físico associado, encontrado pela MMU.

Eu encontrei Drivers de dispositivos Linux para ser uma boa introdução às entranhas do kernel do Linux. Finalmente, você pode querer usar a fonte .

    
por 26.12.2010 / 12:58