linux - tag - ¿Por qué necesitamos zone_highmem en x86?
qué es un meta html (3)
En Linux kernel, mem_map
es la matriz que contiene todos los descriptores de "struct page". Esas páginas incluyen la memoria de 128MiB en lowmem para mapear dinámicamente highmem.
Dado que el tamaño de lowmem es 1GiB, la matriz mem_map
solo tiene entradas de 1GiB / 4KiB = 256KiB. Si cada tamaño de entrada es de 32 bytes, entonces el tamaño de la memoria mem_map = 8MiB. Pero si pudiéramos usar mem_map
para mapear toda la memoria física 4GiB (si tenemos tanta memoria física disponible en x86-32), entonces la matriz mem_map ocuparía 32MiB, eso no es mucha memoria del núcleo (¿o estoy equivocado?) .
Entonces mi pregunta es: ¿por qué necesitamos usar ese 128MiB en baja para el mapeo indirecto de alto valor en primer lugar? O dicho de otra manera, ¿por qué no mapear directamente la memoria física máxima de 4GiB (si está disponible) en el espacio del kernel?
Nota: si mi comprensión de la fuente del kernel anterior es incorrecta, corrígela. ¡Gracias!
3.6 GB no es el techo cuando se usa la extensión de dirección física, que comúnmente se necesita en la mayoría de las tarjetas x86 modernas, especialmente con hotplug de memoria.
Mira aquí: http://www.xml.com/ldd/chapter/book/ch13.html
Kernel low memory es el mapa de memoria "real", direccionado con punteros de 32 bits en x86.
Kernel high memory es el mapa de memoria "virtual", direccionado con estructuras virtuales en x86.
No desea asignarlo todo al espacio de direcciones del kernel, porque no siempre se puede tratar todo y necesita la mayor parte de la memoria para segmentos de memoria virtual (espacio de proceso virtual, mapeado por página).
Al menos, así es como lo leo. Guau, esa es una pregunta complicada que preguntaste.
Para arrojar más confusión, el capítulo 13 habla sobre algunos dispositivos PCI que no pueden abordar el espacio de 32 bits, que fue la génesis de mi comentario anterior:
En x86, parte del uso de la memoria del kernel está limitado al primer Gigabyte de memoria debido a problemas de direccionamiento de DMA. No estoy 100% familiarizado con el tema, pero hay un modo de compatibilidad para DMA en el bus PCI. Eso puede ser lo que estás mirando.
O dicho de otra manera, ¿por qué no mapear directamente la memoria física máxima de 4GiB (si está disponible) en el espacio del kernel?
Una razón es el espacio de usuario: cada proceso de espacio de uso tiene su propio espacio de direcciones virtuales. Supongamos que tiene 4Gb de RAM en x86. Entonces, si sugerimos que el kernel posee 1Gb de memoria (~ 800 directamente mapeados + ~ 200 vmalloc), todos los demás ~ 3Gb deberían distribuirse dinámicamente entre los procesos que giran en el espacio del usuario. Entonces, ¿cómo puedes mapear tus 4Gbs directamente cuando tienes varios espacios de direcciones?
¿Por qué necesitamos zone_highmem en x86?
El motivo es el mismo Kernel solo reserva ~ 800Mb para baja memoria. El resto de la memoria se asignará y conectará con una dirección virtual particular solo a pedido. Por ejemplo, si va a ejecutar un binario, se creará un nuevo espacio de dirección virtual y se asignarán algunas páginas para almacenar su código binario y sus datos (montón, pila ...). Entonces, el atributo clave de la memoria alta es atender solicitudes de asignación dinámica de memoria, nunca se sabe de antemano qué se activará por el espacio de usuario ...