
Estoy en medio de la integración de una aplicación de software en una distribución personalizada de Linux integrado de un proveedor de conjuntos de chips. Este es un producto basado en ARM en el que estoy trabajando. Noté que el kernel se está construyendo en 64 bits, pero el resto del espacio de usuario es de 32 bits.
¿Existe algún beneficio de rendimiento al crear un kernel de 64 bits a pesar de que el espacio de usuario sea de 32 bits? El SOC se basa en ARM corteza-a53.
Alguien sugirió que tener espacio de usuario en 32 bits dará como resultado una menor huella de RAM para el espacio de usuario. Lo mismo debería aplicarse al kernel, pero el kernel es de 64 bits. ¿Supongo que hay una ganancia en el rendimiento?
algunos detalles específicos sobre el hardware:
- corteza del brazo a53
- 1 GB de RAM
PD: No puedo revelar el nombre del proveedor debido a restricciones de no divulgación.
Respuesta1
El espacio de direcciones virtuales del proceso de Linux se divide en dos áreas:
- espacio del núcleo
- espacio de usuario.
Dividido en arquitecturas de 32 bits
En una arquitectura de 32 bits, por ejemplo, arm o i386, la división tradicional es 3:1, como se muestra a continuación:
+--------+ 0xffffffff
| Kernel |
+--------+ 0xc0000000
| |
| User |
| |
+--------+ 0x00000000
- Espacio del núcleo: 1 GiB
- Espacio de usuario: 3 GiB
Por lo tanto, el kernel puede asignar como máximo 1 GiB de memoria física en cualquier momento, pero hay una división adicional, porque necesitamos espacio de direcciones virtuales para que los mapas temporales accedan al resto de la memoria física. La división es la siguiente:
- Los 896 MiB inferiores (0xc0000000 a 0xf7ffffff) se asignan directamente al espacio de direcciones físicas del kernel.
- los 128 MiB restantes (0xf8000000 a 0xffffffff) los utiliza el kernel bajo demanda para asignarlos a memoria alta.
El arreglo es el siguiente:
physical memory 2 GiB
+------> +------------+
| | 1152 MiB |
| | |
+------------------+ 0xffffffff -----+ | HIGH MEM |
| On Demand 128MiB | | |
+------------------+ 0xf8000000 ------------> +------------+
| | ------+
| Direct mapped | +-----> +------------+
| 896 MiB | --+ | 896 MiB |
+------------------+ 0xc0000000 +---------> +------------+
Por lo tanto, el kernel de Linux a través de la interfaz highmem proporciona acceso indirecto a esta memoria física en un rango de 2/4/6/8 GiB. Sin embargo, existe un costo asociado a la creación de asignaciones temporales que puede ser bastante alto. El arco tiene que manipular las tablas de páginas del núcleo, los datos TLB y/o los registros de la MMU.
Sobre arquitecturas de 64 bits
La división 3G/1G no aplica. Debido al enorme espacio de direcciones, se puede elegir un esquema dividido entre el espacio del usuario y el espacio del kernel que permita asignar toda la memoria física al espacio de direcciones del kernel. Ahorrando así todos los gastos generales de asignaciones temporales en los que incurre una arquitectura de 32 bits.
El soporte de memoria alta es opcional en el caso del kernel de Linux en arquitecturas de 64 bits e incluso está deshabilitado en los casos de Linux en arquitecturas de 64 bits.
Referencia:Manejo de alta memoria de Linux.