2010-01-12 26 views
5

Estoy mirando el modelo de memoria Linux IA-32 de un proceso y tengo una pregunta simple para él. ¿Qué contienen las áreas grises de la imagen? ¿Están solo incluidos para mostrar el comienzo y el final de la memoria? Entonces, ¿el texto comienza en 0x0 y la pila comienza en 0xFFFFFFFF?Modelo de memoria Linux IA-32

Reabierto: Hola, en un curso de SO, asistir a esta pregunta vuelve a ser relevante. Específicamente, necesito saber qué contienen las áreas grises. En base a las respuestas hasta ahora, puedo ver que contiene el código del núcleo en la parte superior y una página de eliminación de referencias del puntero nulo en la parte inferior. Pero, ¿cuál es el código del kernel? No asumo que es todo el sistema operativo en sí mismo, pero ¿podría ser un programador incrustado, llamadas a la biblioteca del kernel o?

Saludos, Lasse Espeholt

alt text http://img403.imageshack.us/img403/3156/capturecj.png

Respuesta

9

creo que esto es más preciso: alt text

+0

Ahh parece tener sentido;) Pero según ese gráfico, los procesos solo tienen ~ 1GB de RAM para trabajar. (0xC0000000 - 0x80480000) pero puede aumentar a la memoria virtual del kernel? –

+1

Es 0x08048000, no 0x80480000. Por lo tanto, es un poco menos de 3 GB. – wj32

+0

Ahh mi mal, gracias :) –

5

creo que las zonas grises simplemente representan regiones de tamaño definido. El texto del programa ciertamente no comenzaría en 0x0, porque la mayoría de los sistemas operativos los usan como páginas no válidas, por lo que las desreferencias nulas pueden capturarse fácilmente. Las pilas de subprocesos tampoco llegarían hasta 0xffffffff porque usualmente el cuarto superior (o mitad) tiene memoria de kernel mapeada.

+0

la referencia nula tiene mucho sentido;) gracias. –

2

Tenga en cuenta que la zona cero de página en la parte inferior del espacio de direcciones es no realidad prohibido el uso de la aplicación en virtud de las distribuciones de Linux más comunes. El kernel solía hacer esto, y luego terminaba sacando esa decisión al módulo LSM (por ejemplo, SELinux, AppArmor). Y no aplicaron la misma regla, por lo que resultó posible que los procesos mapeen la memoria en 0x0. Esto era parte de la vulnerabilidad detrás de los recientes exploits "kernel null puntero dereference".

+0

'/ proc/sys/vm/mmap_min_addr' está predeterminado en no-cero por el núcleo de vanilla, por lo que esto solo importa si tiene una distribución que lo cambia o usa LSM. No sé qué tan común es eso; Debian no, Ubuntu no (a menos que Wine esté instalado), Gentoo no, ... y esas son todas las distribuciones que uso. – ephemient

+0

Fedora y Red Hat envían SELinux habilitado por defecto. Novell/SuSE envía AppArmor, al igual que Ubuntu en versiones recientes. LSM es más la regla que la excepción en el mundo moderno, y sucede que esto dio como resultado una regresión en la protección de página nula. –

3

Nadie parece haber mencionado que no toda la memoria en el espacio disponible está necesariamente asignada (y casi nunca lo es).

Cuestiones relacionadas