Há algum benefício de desempenho de construir o kernel como 64 bits, mesmo que o espaço do usuário seja de 32 bits?

3

Estou no meio da integração de um software de aplicativo em uma distribuição personalizada do Embedded Linux de um fornecedor de chipsets. Este é um produto baseado em ARM em que estou trabalhando. Notei 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 de construir o kernel como 64 bits, mesmo que o espaço do usuário em 32 bits? O SOC é baseado no córtex ARM-a53.

Alguém sugeriu que o espaço do usuário em 32 bits resultaria em uma pegada de RAM menor 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?

alguns específicos sobre o hardware:

  • córtex ARM a53
  • 1 GB de RAM

P.S: Não posso divulgar o nome do fornecedor devido a restrições de não divulgação.

    
por sob 01.06.2017 / 19:22

1 resposta

1

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
Portanto, o kernel pode no máximo mapear 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 que os mapas temporários acessem o restante da memória física. A divisão é a seguinte:

  • 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 .

    
por 17.06.2017 / 10:06