2012-02-26 25 views
8

Al estudiar los sistemas operativos (principalmente con Linux como referencia), hay algunos puntos que no encuentro bien explicados en el material que he estudiado.Segmentación de memoria en sistemas operativos modernos

Los programas cargados en la memoria a menudo se describen divididos en segmentos de texto, datos, pila, etc., incluso en el contexto de sistemas operativos como Linux donde la memoria virtual se basa exclusivamente en paginación. ¿Es el caso que es solo el programa, y ​​no la memoria en sí misma, lo que se conoce como segmentado? Si es así, creo que la terminología es confusa.

Vi que malloc se puede implementar en Linux utilizando la llamada 'sbrk' que aumenta el tamaño del segmento de datos. De nuevo, ¿este "segmento de datos" es solo una región de memoria que se usa para datos por convención y no como un segmento "real"? (Pregunta adicional: 'sbrk' no parece ser capaz de disminuir el tamaño del 'segmento'. ¿Esto significa que un proceso nunca puede liberar memoria en el sistema operativo que no sea salir?)

También me ha interesado saber por qué los sistemas operativos modernos no parecen estar usando la segmentación (paginada). ¿No evitaría ciertos tipos de ataques que el código resida en su propio segmento protegido, aumentando así la seguridad? Por otro lado, ¿esto haría, p. Compilación JIT imposible/difícil?

Además de las respuestas "sí"/"no" a las preguntas anteriores, estoy interesado en cualquier aclaración detallada sobre el tema.

Gracias de antemano.

+0

También hay 'brk', que * puede * establecer el programa de ruptura a un valor inferior. Y los segmentos * están * divididos en páginas, y cada página * puede * de hecho ser de solo lectura o no ejecutarse, y el segmento de texto y el segmento de ro-data generalmente se establecerán de esta manera. –

Respuesta

4

El segmento en "segmento de datos" no tiene nada que ver con la segmentación de hardware, que es una característica de poca relevancia para los sistemas operativos modernos (es decir, redundante con respecto a paginación) que se basa en paginación para implementar memoria virtual. Los segmentos también tienen inconvenientes graves en comparación con la búsqueda (por ejemplo, la memoria contigua en un segmento debe ser físicamente contigua) sin ningún beneficio. Por "segmento" para programas de espacio de usuario, uno literalmente significa una sección contigua del espacio virtual del proceso.

Muchas arquitecturas ya no tienen segmentación. En x86, la segmentación es solo una carga útil histórica y está configurada para tener un segmento de datos y código que cubre todo el espacio de direcciones porque la segmentación no se puede omitir.

Tu pregunta sobre la liberación de memoria obtenida a través de sbrk se contesta aquí: How do I free memory obtained by sbrk()?

+0

Gracias por su respuesta. ¿No hay forma de que podamos beneficiarnos de la segmentación _paged_? Me parece que tener los segmentos en segmentos reales con su propio espacio de direcciones simplificaría la administración de la memoria y eliminaría la posibilidad de que la pila y el segmento de datos se alcancen entre sí. El manejo del segmento podría ser manejado por el compilador/enlazador. En cualquier caso, creo que el uso de la palabra "segmento" en el segmento de datos, etc., es solo pedir confusión. Creo que debería agregar algunas notas de desambiguación a algunas páginas de wikipedia :) –

+1

@Gnurou Creo que te confundiste. Los segmentos x86 se definen en el espacio de direcciones _linear_ (es decir, virtual), lo que significa que la búsqueda se produce después de la segmentación. Esto se establece claramente en la sección 3.1 de [Intel® 64 y IA-32 Architectures Developer's Manual: vol. 3A] (http://www.intel.com/content/www/us/en/architecture-and-technology/64-ia-32-architectures-software-developer-vol-3a-part-1-manual.html) – reima

+0

reima: tienes razón, gracias por señalarlo. Eliminando estos comentarios. – Gnurou

Cuestiones relacionadas