2009-02-23 18 views
6

En el kernel de Linux, 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.¿por qué necesitamos zone_highmem en x86?

Dado que el tamaño de lowmem es 1GiB, la matriz mem_map tiene solo 1GiB/4KiB = 256KiB. Si cada tamaño de entrada es de 32 bytes, entonces el tamaño de 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?) .

Así que mi pregunta es: ¿por qué tenemos que usar ese 128MiB en baja para el mapeo de alto valor indirecto 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 núcleo anterior es incorrecta, corríjala. ¡Gracias!

Respuesta

1

vistazo aquí: http://www.xml.com/ldd/chapter/book/ch13.html

Kernel poca memoria es el mapa de la memoria 'real', se dirigió con los 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 los segmentos de memoria virtual (espacio de proceso virtual, mapeado en la página.)

Al menos, así es como lo leí. Guau, esa es una pregunta complicada que preguntaste.

Para arrojar más confusión, capítulo 13 habla de algunos dispositivos PCI no ser capaz de abordar el espacio de 32 bits, que fue el origen de mi anterior comentario:

en x86, un cierto uso de memoria del núcleo se limita a el primer Gigabyte de memoria debido a preocupaciones 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.

0

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 memoria hotplug.

0

O dicho de otra manera, ¿por qué no mapear todos esos max 4GiB físicos memoria (si está disponible) en el espacio del núcleo directamente?

Una de las razones 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 ser dinámicamente distribuidos entre 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?

La razón es la misma. 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 ...). Por lo tanto, el atributo clave de la memoria alta es atender solicitudes de asignación de memoria dinámica, nunca se sabe de antemano qué se activará por el espacio de usuario ...

Cuestiones relacionadas