En el kernel de Linux de 64 bits, ¿cuánta memoria asigna el kernel de forma contigua?

Aug 21 2020

He revisado el desarrollo del kernel de Linux de Robert Love y otras fuentes. Y en todas partes se menciona que en un sistema x86 de 32 bits, el kernel posee el 1 GB superior del espacio de direcciones virtuales, de ese hasta 896 MB se asignan de forma contigua a la memoria física (llamada ZONE_NORMAL), el resto se asigna al espacio restante de 128 MB según sea necesario, y puede que no sea contiguo (ZONE_HIGHMEM).

En 64 bits, se elimina el problema de no tener suficiente espacio de direcciones virtuales. Y el mapa de memoria se describe como,

0xffffffffffffffff  +-----------+
                    |           |
                    |           | Kernelspace
                    |           |
0xffff800000000000  +-----------+
                    |           |
                    |           |
                    |   hole    |
                    |           |
                    |           |
0x00007fffffffffff  +-----------+
                    |           |
                    |           |  Userspace
                    |           |
0x0000000000000000  +———————————+

Sin embargo, no está claro en este mapa qué parte del espacio del núcleo se requiere para ser contiguo físicamente (como se define en ZONE_NORMAL). y cuánto se asigna según sea necesario.

¿El ZONE_HIGHMEM en el kernel de 64 bits es siempre 0? ¿Dado que toda la memoria está bastante dentro del rango del espacio de direcciones virtuales?

Pero la memoria contigua fija del kernel (que no se puede paginar) también requeriría ser pequeña, ya que esa porción de memoria física nunca estaría disponible para otros procesos de usuario. Por lo tanto, el núcleo requeriría usar memoria que no necesita ser contigua (como ZONE_HIGHMEM), según sea necesario. Esto entra en conflicto con que ZONE_HIGHMEM esté vacío en los núcleos de 64 bits.

Por lo tanto, estoy confundido acerca de cuánto del espacio del núcleo se fija físicamente contiguo y cuánto no es contiguo en el caso de los núcleos de 64 bits.

Respuestas

2 StephenKitt Aug 21 2020 at 11:44

No hay HIGHMEMx86 de 64 bits, CONFIG_HIGHMEMdepende deX86_32 .

Hay dos asignaciones fijas de memoria física en x86 de 64 bits :

ffff888000000000 | -119.5  TB | ffffc87fffffffff |   64 TB | direct mapping of all physical memory (page_offset_base)

y el área que comienza en

ffffffff80000000 |   -2    GB | ffffffff9fffffff |  512 MB | kernel text mapping, mapped to physical address 0

(las direcciones negativas son compensaciones desde el final del espacio de direcciones).

Este último corresponde a lo que estás pensando, hasta donde yo sé, y tiende a ser pequeño; vea la línea "Memoria" que se muestra durante el arranque:

Memory: 20144992K/20660008K available (14339K kernel code, 2406K rwdata, 8340K rodata, 2488K init, 5116K bss, 515016K reserved, 0K cma-reserved)

(poco menos de 30MiB) y cualquier memoria bloqueada por módulos cargados más tarde.