operating-system - simple - segmento informatica
Segmentación en Linux: ¿segmentación y paginación son redundantes? (5)
Estoy leyendo "Understanding Linux Kernel". Este es el fragmento que explica cómo Linux usa Segmentación que no entendí.
La segmentación se ha incluido en microprocesadores de 80 x 86 para alentar a los programadores a dividir sus aplicaciones en entidades lógicamente relacionadas, como subrutinas o áreas de datos globales y locales. Sin embargo, Linux usa la segmentación de una manera muy limitada. De hecho, la segmentación y la paginación son algo redundantes , ya que ambas pueden utilizarse para separar los espacios de direcciones físicas de los procesos: la segmentación puede asignar un espacio de direcciones lineal diferente a cada proceso, mientras que la paginación puede asignar el mismo espacio de direcciones en diferentes espacios de direcciones físicas . Linux prefiere la paginación a la segmentación por las siguientes razones:
La administración de memoria es más simple cuando todos los procesos usan los mismos valores de registro de segmento, es decir, cuando comparten el mismo conjunto de direcciones lineales.
Uno de los objetivos de diseño de Linux es la portabilidad a una amplia gama de arquitecturas; Las arquitecturas RISC en particular tienen soporte limitado para la segmentación.
Todos los procesos de Linux que se ejecutan en modo de usuario utilizan el mismo par de segmentos para abordar las instrucciones y los datos. Estos segmentos se denominan segmento de código de usuario y segmento de datos de usuario, respectivamente. De manera similar, todos los procesos de Linux que se ejecutan en el modo Kernel utilizan el mismo par de segmentos para abordar instrucciones y datos: se denominan segmento de código kernel y segmento de datos kernel, respectivamente. La Tabla 2-3 muestra los valores de los campos del Descriptor de segmento para estos cuatro segmentos cruciales.
No puedo entender el 1er y el último párrafo.
La segmentación y la paginación no son en absoluto redundantes. El sistema operativo Linux incorpora completamente la búsqueda de demanda, pero no utiliza la segmentación de memoria. Esto le da a todas las tareas un espacio de direcciones plano, lineal y virtual de 32/64 bits.
La paginación agrega otra capa de abstracción a la traducción de la dirección de memoria. Con la paginación, las direcciones de memoria lineal se asignan a páginas de memoria, en lugar de traducirse directamente a la memoria física. Dado que las páginas pueden intercambiarse dentro y fuera de la memoria RAM física, la paginación permite asignar más memoria que la disponible físicamente. Solo las páginas que se utilizan activamente deben asignarse a la memoria física.
Una alternativa al intercambio de páginas es el intercambio de segmentos, pero en general es mucho menos eficiente dado que los segmentos generalmente son más grandes que las páginas.
La segmentación de la memoria es un método para asignar múltiples fragmentos de memoria (por tarea) para diferentes propósitos y permitir que esos fragmentos estén protegidos entre sí. En Linux, las secciones de código, datos y pila de una tarea se asignan a un único segmento de memoria.
Los procesadores de 32 bits no tienen un bit de modo para deshabilitar la segmentación, pero se puede lograr el mismo efecto asignando la pila, el código y los espacios de datos al mismo rango de direcciones lineales. Los desplazamientos de 32 bits utilizados por las instrucciones del procesador de 32 bits pueden cubrir un espacio de direcciones lineal de cuatro gigabytes.
Además, la documentación de Intel establece:
Un modelo plano sin buscapersonas requiere mínimamente un GDT con un código y un descriptor de segmento de datos. También se requiere un descriptor nulo en la primera entrada GDT. Un modelo plano con paginación puede proporcionar descripciones de código y datos para el modo de supervisor y otro conjunto de descriptores de código y datos para el modo de usuario
Esta es la razón para tener un par de CS / DS para la ejecución de privilegios del kernel (anillo 0) y un par de CS / DS para la ejecución de privilegios del usuario (anillo 3).
Resumen: la segmentación proporciona un medio para aislar y proteger secciones de la memoria. La búsqueda proporciona un medio para asignar más memoria a lo que está disponible físicamente.
La familia de CPUs 80x86 genera una dirección real al agregar el contenido de un registro de CPU llamado registro de segmento al del contador de programa. Por lo tanto, al cambiar el contenido del registro de segmento, puede cambiar las direcciones físicas a las que accede el programa. La paginación hace algo similar asignando la misma dirección virtual a diferentes direcciones reales. El uso de Linux usa lo último: los registros de segmento para procesos de Linux siempre tendrán el mismo contenido inmutable.
Los sistemas operativos modernos (es decir, Linux, otros Unixen, Windows NT, etc.) no utilizan la función de segmentación proporcionada por el procesador x86. En cambio, usan un modelo de memoria plana de 32 bits. Cada proceso de modo de usuario tiene su propio espacio de direcciones virtuales de 32 bits.
(Naturalmente, los anchos se expanden a 64 bits en sistemas x86_64)
Intel agregó por primera vez la segmentación en el 80286, y luego la búsqueda en el 80386. Los sistemas operativos tipo Unix generalmente usan la búsqueda de memoria virtual.
De todos modos, dado que la paginación en x86 no admitía permisos de ejecución hasta hace poco, OpenWall Linux utilizó la segmentación para proporcionar regiones de pila no ejecutables, es decir, estableció el límite del segmento de código en un valor inferior al límite del otro segmento e hizo alguna emulación para apoyar trampolines en la pila.
Windows usa el segmento fs
para el almacenamiento de hilos local. Por lo tanto, el vino tiene que usarlo, y el kernel de Linux debe ser compatible.