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

43

Linux usa un sistema de memoria virtual donde todas las direcciones son direcciones virtuales y no direcciones físicas. El procesador convierte estas direcciones virtuales en direcciones físicas.

Para facilitar esta traducción, la memoria virtual y física se dividen en páginas. Cada una de estas páginas recibe un número único; El número de marco de página.

Algunos tamaños de página pueden ser de 2 KB, 4 KB, etc. Pero, ¿cómo se determina este número de tamaño de página? ¿Está influenciado por el tamaño de la arquitectura? Por ejemplo, un bus de 32 bits tendrá 4 GB de espacio de direcciones.

JohnMerlino
fuente

Respuestas:

56

Puede averiguar el tamaño de página predeterminado de un sistema consultando su configuración mediante el getconfcomando:

$ getconf PAGE_SIZE
4096

o

$ getconf PAGESIZE
4096

NOTA: Las unidades anteriores generalmente están en bytes, por lo que el 4096 equivale a 4096 bytes o 4kB.

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 cambias bits, estás realizando una multiplicación binaria por 2. Entonces, en efecto, un desplazamiento de bits a la izquierda ( 1 << PAGE_SHIFT) está haciendo la multiplicación de 2 ^ 12 = 4096.

$ echo "2^12" | bc
4096
slm
fuente
2
El hardware moderno admite 2 MB y algunos 1 GB de tamaño de página. ¿Se puede establecer "PAGE_SHIFT" en 21 para páginas de 2 MB como valor predeterminado para la compilación del núcleo?
ReverseFlow
2
@ReverseFlow Para obtener una respuesta de este tipo, haría una pregunta por separado.
Kirill Bulygin
@sim, preguntándome por qué se utilizan manipulaciones de bits aquí? Leí que el compilador generalmente convierte las multiplicaciones en manipulaciones de bits, por lo tanto, ofrece el mismo rendimiento.
InAFlash
17

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 (en 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, por ejemplo, 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 ( CONFIG_HUGETLB_PAGEes necesario, y CONFIG_HUGETLBFStambién para la mayoría de los usos). Esto corresponde al segundo nivel más profundo de descriptores de MMU (lo que Linux llama PMD) (o al menos generalmente lo hace, 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 MMU más profundo significa más memoria del núcleo para las tablas de páginas.
  • Un nivel de descriptor 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 considerable. Es por eso 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 el sistema con la getconfutilidad o de la función C sysconf.

$ getconf PAGE_SIZE
4096

El uso de páginas enormes requiere montar el hugetlbfssistema de archivos y hacer mmapping a los archivos allí.

Gilles 'SO- deja de ser malvado'
fuente
Para su información: el uso de páginas enormes no requiere el montaje de hugetlbfs, ya que las notas del documento del kernel en la parte inferior también pueden usar llamadas de memoria compartida o una bandera mmap. Además, lo más interesante es que puede habilitar páginas enormes transparentes, luego el núcleo convertirá automáticamente las páginas normales en páginas enormes cuando sea posible en todas las aplicaciones.
derobert
Esta es la respuesta verdaderamente fundamental. Linux está diseñado para usar bien el hardware de paginación. Más detalles sobre la paginación: stackoverflow.com/questions/18431261/how-does-x86-paging-work
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
0

El tamaño de la página depende principalmente de la arquitectura del procesador. En x86, desde los tiempos del procesador 386 que introdujo el modo protegido, el tamaño de la página ha sido de 4 kB.

En el modo x64, también puede haber páginas enormes, que tienen un tamaño de 2 MB. Sin embargo, usarlos es un poco complicado.

Puede encontrar más información sobre el tamaño de página en el artículo de Wikipedia

Tero Kilkanen
fuente
0

El procesador determina los tamaños de página disponibles. Para la mayoría de los propósitos, el tamaño de página implementado por hardware en los procesadores x86 y x86_64 es de 4kb. Sin embargo, el sistema operativo puede asignar más de una página a la vez si así lo desea, y así implementar efectivamente páginas de 8kb, 16kb o 32kb en software.

Los procesadores x86 y x86_64 también pueden mezclar respectivamente páginas de 4mb y 2mb junto con las páginas estándar de 4kb. Si esa capacidad se usa, se usaría principalmente para asignar espacio en el núcleo.

Leslie
fuente