¿Por qué Debian Linux permite hasta 128TiB de espacio de direcciones virtuales por proceso pero solo 64TiB de memoria física?

23

Acabo de leer aquí :

  • hasta 128TiB de espacio de direcciones virtuales por proceso (en lugar de 2GiB)
  • Soporte de memoria física de 64TiB en lugar de 4GiB (o 64GiB con la extensión PAE)

¿Porqué es eso? Quiero decir, ¿el soporte de memoria física está limitado por el núcleo o por el hardware actual?

¿Por qué necesitaría el doble del espacio de memoria virtual que la memoria física que realmente puede abordar?

gsi-frank
fuente
También puede agregar intercambio.
Thorbjørn Ravn Andersen
2
eso es mucha RAM ...
dalearn
44
@dalearn: sabes, cuando me enteré de que podías obtener una expansión de memoria con cambio de banco para micros de 8 bits que les permitía tener hasta 4096 KB, dije exactamente lo mismo ...
Jules

Respuestas:

35

Esos límites no provienen de Debian o Linux, provienen del hardware. Las diferentes arquitecturas (procesador y bus de memoria) tienen diferentes limitaciones.

En los procesadores de PC x86-64 actuales, la MMU permite 48 bits de espacio de direcciones virtuales . Eso significa que el espacio de direcciones está limitado a 256 TB. Con un bit para distinguir las direcciones de kernel de las direcciones de usuario, eso deja 128TB para el espacio de direcciones de un proceso.

En los procesadores x86-64 actuales, las direcciones físicas pueden usar hasta 48 bits , lo que significa que puede tener hasta 256 TB. El límite ha aumentado progresivamente desde que se introdujo la arquitectura amd64 (de 40 bits si recuerdo correctamente). Cada bit de espacio de direcciones cuesta algo de lógica de cableado y decodificación (lo que hace que el procesador sea más caro, más lento y más caliente), por lo que los fabricantes de hardware tienen un incentivo para mantener el tamaño bajo.

Linux solo permite que las direcciones físicas suban a 2 ^ 46 (por lo que solo puede tener hasta 64 TB) porque permite que la memoria física se asigne por completo en el espacio del kernel. Recuerde que hay 48 bits de espacio de direcciones; un bit para kernel / user deja 47 bits para el espacio de direcciones del kernel. La mitad de eso en la mayoría de los casos se dirige directamente a la memoria física, y la otra mitad permite que el núcleo asigne lo que necesite. (Linux puede hacer frente a la memoria física que no se puede asignar en su totalidad al mismo tiempo, pero que introduce una complejidad adicional, por lo que solo se hace en plataformas donde es necesario, como x86-32 con PAE y armv7 con LPAE).

Es útil que la memoria virtual sea más grande que la memoria física por varias razones:

  • Permite que el kernel asigne toda la memoria física y tenga espacio para los mappins virtuales.
  • Además de las asignaciones de memoria física, hay asignaciones de intercambio, de archivos y de controladores de dispositivo.
  • Es útil tener memoria sin asignar en algunos lugares: páginas de protección para detectar desbordamientos de búfer , grandes zonas sin asignar debido a ASLR , etc.
Gilles 'SO- deja de ser malvado'
fuente
99
La limitación de 46 bits en la memoria física está relacionada con el mapa de memoria de Linux : incluye una asignación completa de la memoria física en el espacio del kernel, lo que significa que la memoria física solo puede corresponder a una cuarta parte del espacio de direcciones disponible.
Stephen Kitt
¿Alguien podría dar más detalles sobre el comentario de @StephenKitt? Estoy muy interesado en entender eso, pero incluso después de leer la referencia que citó no lo entiendo;)
gsi-frank
@ gsi-frank Es conveniente que el núcleo tenga toda la memoria física asignada permanentemente. Entonces, en un espacio de direcciones 2 ^ 48, 2 ^ 47 va a las direcciones de los usuarios, 2 ^ 46 va a las direcciones del núcleo y 2 ^ 46 es para el direccionamiento de la memoria física.
Gilles 'SO- deja de ser malvado'
@ gsi-frank Si puede obtener una copia del libro clásico " Desarrollando su propio sistema operativo de 32 bits ", se profundiza en la razón por la cual el autor tomó una decisión similar para su propio sistema operativo (en ese caso, dividiendo el espacio de direcciones virtuales de 4GiB del 80386 en un segmento de kernel de 2GiB que contiene una asignación de RAM física de 1GiB y un segmento de usuario de 2GiB). Cualquier persona interesada en los componentes internos del sistema operativo probablemente debería leerlo: proporciona un diseño completo de un sistema lo suficientemente simple como para entenderlo pero lo suficientemente avanzado como para ser útil.
Jules
Desde la versión 4.13 del kernel, x86-64 (y algunas otras arquitecturas) se pueden construir con tablas de páginas de cinco niveles , que aumentan el espacio de direcciones en x86-64 a 52 bits para RAM física y 57 bits para virtual (4 PiB / 128 PiB). Tenga en cuenta que el mapa de memoria en el espacio del núcleo presenta problemas de seguridad, por lo que es probable que cambie en un futuro próximo.
Stephen Kitt
9

No sé por qué, pero puedo pensar en siete razones por las que sería útil admitir el doble de espacio de direcciones que la memoria física.

  1. La primera es para que pueda ejecutar aplicaciones que necesitan memoria adicional, incluso si eso significa cambiar a disco.
  2. Diseños de memoria más limpios para particionar el uso de memoria. Por ejemplo, un sistema operativo puede tomar direcciones con números más altos y dejar direcciones con números más bajos para que las aplicaciones hagan que la separación sea más limpia.
  3. La aleatorización del diseño del espacio de direcciones es un poco más efectiva.
  4. Marcar páginas como ejecutables puede significar memoria sobrante.
  5. E / S mapeadas en memoria.
  6. La asignación de memoria es más fácil: se pueden asignar fragmentos más grandes a la vez.
  7. Fragmentación de memoria reducida
lungj
fuente
1
¡Gracias! 1) es tan evidente y básico que me da vergüenza la pregunta;)
gsi-frank
2
(3) también es muy importante. Usted realmente desea un espacio de dirección virtual que es varios órdenes de magnitud mayor que la cantidad de memoria que va a asignando de manera que conjeturas al azar es casi seguro que dan lugar a trampas.
R ..
6

Esas son limitaciones de hardware. El hardware actual x86_64 / amd64 permite direcciones virtuales de 48 bits y varios tamaños (depende de la implementación; por ejemplo, mi estación de trabajo aquí solo admite 36 bits) direcciones físicas. El kernel de Linux divide el espacio de direcciones virtuales a la mitad (usando la mitad para el kernel, la mitad para el espacio de usuario, tal como lo hace en x86).

Entonces obtienes:

2⁴⁸ bytes ÷ 2 = 2⁴⁷ bytes = 128 TiB

El tamaño de la dirección física a menudo es menor porque en realidad es físico. Ocupa pines / pads, transistores, conexiones, etc., en / en la CPU y traza líneas en la placa. Probablemente también lo mismo en los chipsets. No tiene sentido admitir una cantidad de RAM que es inconcebible durante la vida útil de diseño del núcleo del procesador o del zócalo; todas esas cosas cuestan dinero. (Incluso con 32 ranuras DIMM y 64GiB DIMM en cada una, todavía tiene solo 2TiB. Incluso si la capacidad DIMM se duplica anualmente, estamos a 5 años de 64TiB.

Como señala Peter Cordes , las personas ahora están conectando almacenamiento no volátil, como 3D XPoint, al bus de memoria, lo que hace que se quede sin espacio de direcciones. Los procesadores más nuevos han ampliado el espacio de direcciones físicas a 48 bits; Es posible que el wiki de Debian no haya sido actualizado.

derobert
fuente
El almacenamiento no volátil conectado directamente al bus de memoria (por ejemplo, 3D XPoint) se está convirtiendo en una cosa, y esto podría aumentar en gran medida la demanda de espacio de direcciones físicas en los próximos años (ya que es más denso que DRAM, y es útil tener grandes cantidades de él). en más casos de lo que es útil tener grandes cantidades de RAM). Consulte zdnet.com/article/the-non-volatile-memory-revolution para obtener un artículo no muy técnico (o google para obtener más información). Intel Skylake lo admite con suclflush e clflushoptinstrucciones.
Peter Cordes
1
Ya puede comprar sistemas con hasta 12TiB de RAM en 96 ranuras ( el sistema HPC de cuatro sockets de Tyan, por ejemplo), por lo que 64TiB podría estar a menos de cinco años de distancia. Y algunas personas los compran y les ponen tanta RAM ...
Stephen Kitt
@StephenKitt hmm, está bien porque la capacidad DIMM tarda más de 3 años en duplicarse 😁
derobert
Resulta que en realidad puedes comprar sistemas con 64 TiB de RAM .
Stephen Kitt