Dividir em arquiteturas de 32 bits

Dividir em arquiteturas de 32 bits

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.

informação relacionada