GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo se determina el tamaño de página en el espacio de direcciones virtuales?

Puede averiguar el tamaño de página predeterminado de un sistema consultando su configuración a través del getconf comando:

$ getconf PAGE_SIZE
4096

o

$ getconf PAGESIZE
4096

NOTA: Las unidades anteriores suelen estar en bytes, por lo que 4096 equivale a 4096 bytes o 4 kB.

Esto está cableado en la fuente del kernel de Linux aquí:

Ejemplo

$ more /usr/src/kernels/3.13.9-100.fc19.x86_64/include/asm-generic/page.h
...
...
/* PAGE_SHIFT determines the page size */

#define PAGE_SHIFT  12
#ifdef __ASSEMBLY__
#define PAGE_SIZE   (1 << PAGE_SHIFT)
#else
#define PAGE_SIZE   (1UL << PAGE_SHIFT)
#endif
#define PAGE_MASK   (~(PAGE_SIZE-1))

¿Cómo te da el cambio 4096?

Cuando cambia bits, está realizando una multiplicación binaria por 2. Entonces, en efecto, un cambio de bits a la izquierda (1 << PAGE_SHIFT ) está haciendo la multiplicación de 2^12 =4096.

$ echo "2^12" | bc
4096

El hardware (específicamente, la MMU, que es parte de la CPU) determina qué tamaños de página son posibles. No hay relación con el tamaño del registro del procesador y solo una relación indirecta con el tamaño del espacio de direcciones (ya que la MMU determina ambos).

Casi todas las arquitecturas admiten un tamaño de página de 4 kB. Algunas arquitecturas admiten páginas más grandes (y algunas también admiten páginas más pequeñas), pero 4kB es un valor predeterminado muy generalizado.

Linux admite dos tamaños de página:

  • Páginas de tamaño normal, que creo que son 4kB por defecto en todas las arquitecturas, aunque algunas arquitecturas permiten otros valores, p. 16kB en ARM64 u 8kB, 16kB o 64kB en IA64. Estos corresponden al nivel más profundo de descriptores en la MMU (lo que Linux llama PTE).
  • Páginas enormes, si se compilan en (CONFIG_HUGETLB_PAGE es necesario, y CONFIG_HUGETLBFS también para la mayoría de los usos). Esto corresponde al segundo nivel más profundo de los descriptores de MMU (lo que Linux llama PMD) (o al menos lo suele hacer, no sé si esto se aplica a todas las arquitecturas).

El tamaño de la página es un compromiso entre el uso de la memoria, el uso de la memoria y la velocidad.

  • Un tamaño de página más grande significa más desperdicio cuando una página se usa parcialmente, por lo que el sistema se queda sin memoria antes.
  • Un nivel de descriptor de MMU más profundo significa más memoria de kernel para las tablas de páginas.
  • Un nivel de descriptor de MMU más profundo significa más tiempo dedicado al recorrido de la tabla de páginas.

Las ganancias de los tamaños de página más grandes son pequeñas para la mayoría de las aplicaciones, mientras que el costo es sustancial. Esta es la razón por la que la mayoría de los sistemas usan solo páginas de tamaño normal.

Puede consultar el tamaño de página (normal) en su sistema con el getconf utilidad o la función C sysconf .

$ getconf PAGE_SIZE
4096

El uso de páginas grandes requiere montar el hugetlbfs sistema de archivos y mmap hacer ping a los archivos allí.


Linux
  1. ¿Cómo ordenar la salida Du por tamaño?

  2. Cuánto espacio de intercambio agregar para Oracle Database en Linux

  3. ¿Cómo acceder a direcciones físicas desde el espacio de usuario en Linux?

  4. ¿Cómo asignar memoria que está alineada con el tamaño de página?

  5. Compilando el kernel de Linux, ¿cuánto tamaño se necesita?

Cómo encontrar la dirección IP en Linux

Cómo aumentar el espacio de disco virtual de VM en VirtualBox

Cómo aumentar el tamaño del disco de sus máquinas virtuales existentes en VirtualBox

Cómo cambiar la dirección IP en Linux

Linux:¿cómo se divide un espacio de direcciones virtuales de proceso de 64 bits en Linux?

Cómo aumentar el espacio de disco virtual de la máquina virtual en VirtualBox y VMware