O espaço de endereço virtual do processo do Linux é dividido em duas áreas:
- espaço do kernel
- espaço do usuário.
Dividir em arquiteturas de 32 bits
Em uma arquitetura de 32 bits, por exemplo, arm ou i386, a divisão tradicional é 3: 1, conforme mostrado abaixo:
+--------+ 0xffffffff
| Kernel |
+--------+ 0xc0000000
| |
| User |
| |
+--------+ 0x00000000
- Espaço do Kernel - 1 GiB
- Espaço do usuário - 3 GiB
- inferior a 896 MiB (0xc0000000 a 0xf7ffffff) é mapeado diretamente para o espaço de endereço físico do kernel
- os 128 MiB restantes (0xf8000000 a 0xffffffff) são usados sob demanda pelo kernel para mapear para alta memória.
O arranjo é o seguinte:
physical memory 2 GiB
+------> +------------+
| | 1152 MiB |
| | |
+------------------+ 0xffffffff -----+ | HIGH MEM |
| On Demand 128MiB | | |
+------------------+ 0xf8000000 ------------> +------------+
| | ------+
| Direct mapped | +-----> +------------+
| 896 MiB | --+ | 896 MiB |
+------------------+ 0xc0000000 +---------> +------------+
Assim, o kernel do Linux através da interface highmem fornece acesso indireto a essa memória física no intervalo de 2/4/6/8 GiB. Mas, há um custo associado de criar mapeamentos temporários que podem ser bastante altos. O arco tem que manipular as tabelas de páginas do kernel, os registros de TLB e / ou MMU dos dados.
Em arquiteturas de 64 bits
A divisão 3G / 1G não se aplica. Devido ao enorme espaço de endereçamento, um esquema de divisão entre o espaço do usuário e o espaço do kernel pode ser escolhido, o que permite mapear toda a memória física no espaço de endereço do kernel. Assim, salvando todas as despesas gerais de mapeamentos temporários que uma arquitetura de 32 bits gera.
O suporte de memória alta é opcional no caso do kernel do Linux em arquiteturas de 64 bits e é até desabilitado desabilitado em casos de arquiteturas Linux em 64 bits.
Referência: Manipulação de Memória Alta no Linux .