
Estou no meio da integração de um software aplicativo em uma distribuição personalizada do Embedded Linux de um fornecedor de chipset. Este é um produto baseado em ARM no qual estou trabalhando. Percebi que o kernel está sendo construído em 64 bits, mas o restante do espaço do usuário é de 32 bits.
Há algum benefício de desempenho em construir o kernel como 64 bits, mesmo que o espaço do usuário seja de 32 bits? O SOC é baseado no ARM córtex-a53.
Alguém sugeriu que ter espaço do usuário em 32 bits resultará em menor espaço de RAM para o espaço do usuário. O mesmo deve se aplicar ao kernel, mas o kernel é de 64 bits. Eu estou supondo que há um ganho no desempenho?
algumas informações específicas sobre o hardware:
- Córtex ARM a53
- 1 GB de RAM
PS: Não posso divulgar o nome do fornecedor devido a restrições de não divulgação.
Responder1
O espaço de endereço virtual do processo 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
Assim, o kernel pode mapear no máximo 1 GiB de memória física a qualquer momento, mas há uma divisão adicional, porque precisamos de espaço de endereço virtual para mapas temporários para acessar o restante da memória física. A divisão é a seguinte:
- 896 MiB inferiores (0xc0000000 a 0xf7ffffff) são mapeados 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 memória alta.
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 Linux através da interface highmem fornece acesso indireto a esta memória física na faixa de 2/4/6/8 GiB. Porém, há um custo associado à criação de mapeamentos temporários que pode ser bastante elevado. O arch tem que manipular as tabelas de páginas do kernel, o TLB de dados e/ou os registradores do MMU.
Em arquiteturas de 64 bits
A divisão 3G/1G não se aplica. Devido ao enorme espaço de endereço, pode ser escolhido um esquema de divisão entre o espaço do usuário e o espaço do kernel que permite mapear toda a memória física no espaço de endereço do kernel. Economizando assim todas as despesas gerais de mapeamentos temporários que uma arquitetura de 32 bits incorre.
O suporte de alta memória é opcional no caso de kernel Linux em arquiteturas de 64 bits e está até desabilitado em casos de Linux em arquiteturas de 64 bits.
Referência:Manipulação de alta memória no Linux.