memory - sistemas - ¿El sistema operativo moderno usa paginación y segmentación?
segmentacion simple (2)
Estaba leyendo sobre arquitectura de memoria y me confundí un poco con la paginación y la segmentación. Leí que los sistemas modernos de sistema operativo solo usan paginación para administrar el acceso a la memoria, pero mirando los códigos desensamblados puedo ver segmentos como "ds" y "fs". ¿Significa que el sistema operativo (vio que en Windows y Linux) está usando segmentación y paginación o solo está mapeando todos los segmentos en las mismas páginas (haciendo que los segmentos sean irrelevantes)?
Solo usan paginación para protección de memoria , mientras que usan la segmentación para otros fines (como almacenar datos locales de subprocesos).
De acuerdo, basado en el libro Modern Operating Systems 3rd Edition de Andrew S. Tanenbaum y los materiales de Open Security Training (opensecuritytraining.info), logro entender la segmentación y la paginación, y la respuesta a mi pregunta es:
Conceptos:
1.1. Segmentación:
La segmentación es la división de la memoria en piezas (secciones) llamadas segmentos. Estos segmentos son independientes entre sí, tienen tamaños variables y pueden crecer según sea necesario.
1.2. Memoria virtual:
Una memoria virtual es una abstracción de la memoria real. Esto significa que asigna una dirección virtual (utilizada por los programas) en una dirección física (utilizada por el hardware). Si un programa quiere acceder a la memoria 2000 (mov eax, 2000), la dirección virtual (2000) se convertirá en la dirección física real (por ejemplo, 1422) y luego el programa accederá a la memoria 1422 pensando que está accediendo a la memoria 2000. Por lo tanto, si el sistema usa memoria virtual, los programas ya no tienen acceso directo a la memoria real, sino que utilizan la memoria virtual correspondiente.
1.3. Paginación:
Paginación es un esquema de gestión de memoria virtual. Como se explicó anteriormente, mapea una dirección virtual en una dirección física. La paginación divide la memoria virtual en piezas llamadas "páginas" y también divide la memoria física en piezas llamadas "páginas de marcos". Una página puede vincularse a una o más páginas de marcos (tenga en cuenta que una página puede mapear diferentes páginas de marcos, pero solo una a la vez)
Ventajas y desventajas
2.1. Segmentación:
La principal ventaja de utilizar la segmentación es dividir la memoria en diferentes espacios de direcciones lineales. Con esto, los programas pueden tener un espacio de direcciones para su código, otro para la pila, otro para variables dinámicas (montón), etc. La desventaja de la segmentación es la fragmentación de la memoria. Considere este ejemplo: una parte de la memoria se divide en 4 segmentos asignados secuencialmente ->
seg1(in use) --- seg2(in use)--- seg3(in use)---seg4(in use)
. Ahora si liberamos la memoria de seg2, tendremos ->seg1(in use) --- seg2(FREE)--- seg3(in use)---seg4(in use)
. Si queremos asignar algunos datos, podemos hacerlo utilizando seg2, pero si el tamaño de los datos es mayor que el tamaño de seg2, no podremos hacerlo y el espacio se desperdiciará y la memoria se fragmentará . Otro problema es que algunos segmentos pueden tener un tamaño mayor y, dado que este segmento no se puede "dividir" en partes más pequeñas, debe asignarse por completo en la memoria.2.1. Paginación:
Las principales ventajas de usar paginación es abstraer la memoria física, por lo tanto, los programas (y los programadores) no necesitan preocuparse por las direcciones de memoria. Puede tener dos programas que accedan a la memoria (virtual) 2000 porque se mapeará en dos memorias físicas diferentes. Además, es posible utilizar el disco duro para garantizar que solo las páginas necesarias se asignan a la memoria. La principal desventaja es que la paginación usa solo un espacio de direcciones lineal. La paginación mapea las memorias virtuales desde 0 hasta el máximo valor direccionable para todos los programas. Ahora considere este ejemplo: dos trozos de memoria, "chk1" y "chk2" están uno al lado del otro en la memoria virtual (chk1 se asigna de la dirección 1000 a 2000 y chk2 usa de 2001 a 3000), si chk1 necesita crecer, la OS necesita dejar espacio en la memoria para el nuevo tamaño de chk1. Si eso ocurre nuevamente, el sistema operativo tendrá que hacer lo mismo o, si no se puede encontrar espacio, aparecerá una excepción. Las rutinas para gestionar este tipo de operaciones son muy malas para el rendimiento, ya que este crecimiento y reducción de la memoria ocurre durante mucho tiempo.
Segmentación y paginación
3.1. ¿Por qué combinar ambos?
Un sistema operativo puede combinar segmentación y paginación. ¿Por qué? Debido a que combinando, es posible tener lo mejor de ambos sin sus desventajas. Entonces, la memoria está dividida en muchos segmentos y cada uno de ellos tiene una o más páginas. Cuando un programa intenta acceder a una dirección de memoria, primero el sistema operativo va al segmento correspondiente, allí encontrará la página correspondiente, por lo que va a la página y allí encontrará la página de marco a la que el programa quería acceder. Usando este enfoque, el sistema operativo divide la memoria en varios segmentos, incluidos los segmentos para el kernel y los programas de usuario. Estos segmentos tienen tamaños variables y características de protección de acceso. Para resolver la fragmentación y los problemas de "gran segmento", se utiliza la paginación. Con la búsqueda, un segmento más grande se divide en varias páginas y solo las páginas necesarias permanecen en la memoria (y se pueden asignar más páginas en la memoria si es necesario). Así que, básicamente, los sistemas operativos modernos tienen dos abstracciones de memoria, donde la segmentación se usa más para "manejar los programas" y buscar "administrar la memoria física".
3.2. ¿Cómo funciona realmente?
Un sistema operativo que ejecuta segmentación y búsqueda tendrá las siguientes estructuras:
3.2.1. Selector de segmentos:
Esto representa un índice en la Tabla de descriptores globales / locales. Contiene 3 campos que representan el índice en la tabla de descriptores, un bit para identificar si ese segmento está presente en la tabla de descriptores Global o Local y un nivel de privilegio.
3.2.2. Registro de segmento:
Un registro de CPU utilizado para almacenar el selector de segmento. Usualmente (en una máquina x86) existe al menos el registro CS (segmento de código) y DS (segmento de datos).
3.2.3. Descripciones de segmento:
Esta estructura contiene los datos relativos a un segmento, como su dirección base, tamaño (en páginas o en bytes), el privilegio de acceso, la información de si este segmento está presente en la memoria o no, etc. (para todos los campos, busque para los descriptores de segmento en google)
3.2.4. Tabla de descriptores globales / locales:
La tabla que contiene varios descriptores de segmento. Entonces esta estructura contiene todos los descriptores de segmento para el sistema. Si la tabla es global, puede contener otras cosas como descriptores de tablas de descriptores locales, descriptores de segmento de estado de tareas y descriptores de llamada de puerta (no los explicaré aquí, por favor, escríbalos en google). Si la tabla es Local, solo (hasta donde sé) contiene descriptores de segmento relacionados con el usuario.
3.3. ¿Cómo funciona?
Entonces, para acceder a una memoria, primero el programa necesita acceder a un segmento. Para hacer esto, se carga un selector de segmento en un registro de segmento y luego en una tabla de descriptores globales o locales (dependiendo del campo en el selector de segmento). Esta es la razón de la dirección de memoria completa sea
SEGMENT REGISTER: ADDRESS , like CS:ADDRESS -> 001B:0044BF7A
. Ahora el sistema operativo va a la G / LDT y (usando el campo de índice del selector de segmento) encuentra el descriptor de segmento de la dirección que intenta acceder. Luego verifica si el segmento está presente, la protección y si todo está bien, va a la dirección indicada en el "campo base" (del descriptor) + el desplazamiento de la dirección. Si la búsqueda no está habilitada, el sistema va directamente a la memoria real, pero con la búsqueda en la dirección se trata como una dirección virtual y va al directorio de la página. La dirección base + el desplazamiento se denominan dirección lineal y se interpretarán como 3 campos: directorio + página + desplazamiento. Por lo tanto, en la página Directorio, buscará la entrada del directorio especificada en el campo "directorio" de la dirección lineal, esta entrada apunta a la tabla de páginas y el campo "página" de la dirección lineal se usa para encontrar la página, esto puntos de entrada a una página de marco y el desplazamiento se utiliza para encontrar la dirección exacta a la que el programa desea acceder.3.4. Sistemas operativos modernos
Los sistemas operativos modernos "no usan" la segmentación. Está entre comillas porque usan 4 segmentos: segmento de código de núcleo, segmento de datos de núcleo, segmento de código de usuario y segmento de datos de usuario. Lo que significa es que todos los procesos de los usuarios tienen el mismo código y los mismos segmentos de datos (por lo que el mismo selector de segmento). Los segmentos solo cambian cuando se pasa de usuario a kernel. Entonces, todo el camino explicado en la sección 3.3. ocurre, pero usan los mismos segmentos y, dado que las tablas de página son individuales por proceso, es difícil que ocurra un error de página.
Espero que esto ayude y si hay algún error o algunos detalles más (yo era un poco genérico en algunas partes), no dude en comentar y responder. Gracias chicos
Danilo PC