TEMA 3. GESTIÃN DE MEMORIA - Universidad de AlmerÃa
TEMA 3. GESTIÃN DE MEMORIA - Universidad de AlmerÃa
TEMA 3. GESTIÃN DE MEMORIA - Universidad de AlmerÃa
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
Diseño <strong>de</strong> Sistemas Operativos<br />
Tema <strong>3.</strong> Gestión <strong>de</strong> Memoria<br />
Para acelerar la traducción <strong>de</strong> dirección lógica a dirección lineal (unidad <strong>de</strong> segmentación), el los<br />
procesadores i386 proporcionan un registro adicional no programable por cada uno <strong>de</strong> los registros <strong>de</strong><br />
segmentación programables. Cada registro no programable contiene el <strong>de</strong>scriptor <strong>de</strong> segmento <strong>de</strong> 8 bytes<br />
especificado por el selector <strong>de</strong> segmento contenido en el correspondiente registro <strong>de</strong> segmentación. Cada vez<br />
que un selector <strong>de</strong> segmento es cargado en un registro <strong>de</strong> segmentación, el <strong>de</strong>scriptor <strong>de</strong> segmento<br />
correspondiente es cargado <strong>de</strong> memoria en el registro <strong>de</strong> CPU no programable. Entonces, traducciones <strong>de</strong><br />
direcciones lógicas referentes a ese segmento pue<strong>de</strong>n realizarse sin acce<strong>de</strong>r a la GDT o LDT almacenada en<br />
memoria (el procesador sólo tiene que referenciar directamente a los registros <strong>de</strong> la CPU que contienen el<br />
<strong>de</strong>scriptor <strong>de</strong> segmento. Los accesos a la GDT o LDT son necesarios sólo cuando los contenidos <strong>de</strong>l registro<br />
<strong>de</strong> segmentación cambia. Cada selector <strong>de</strong> segmento incluye los siguientes campos: (1) Un campo índice <strong>de</strong><br />
13 bits que i<strong>de</strong>ntifica la entrada <strong>de</strong>l <strong>de</strong>scriptor <strong>de</strong> segmento correspondiente contenida en la GDT o LDT. (2)<br />
un bit TI (table indicator) que especifica si el <strong>de</strong>scriptor <strong>de</strong> segmento se encuentra en la GDT (TI = 0) o ne la<br />
LDT (TI = 1). (3) un campo RPL (requestor privilege level) <strong>de</strong> 2 bits, que es precisamente el CPL <strong>de</strong> la CPU<br />
cuando el correspondiente selector <strong>de</strong> segmento se carga en CR.<br />
In<strong>de</strong>x TI Desplazamiento Dirección lógica<br />
* 8<br />
+<br />
GDT o LDT<br />
Descriptor <strong>de</strong><br />
Segmento<br />
+<br />
GDT o LDT<br />
Dirección lineal<br />
Figura <strong>3.</strong>9. Traducción <strong>de</strong> una dirección lógica a una dirección lineal (virtual)<br />
<strong>3.</strong>4.2.<strong>3.</strong> Segmentación en Linux<br />
Linux no aprovecha la segmentación <strong>de</strong>l i386. Sin embargo, no pue<strong>de</strong> <strong>de</strong>sactivarla, la utiliza <strong>de</strong> una forma muy<br />
limitada. Se ha preferido la paginación sobre la segmentación porque: (1) La gestión <strong>de</strong> memoria es más<br />
simple cuando todos los procesos usan los mismos valores <strong>de</strong> segmentos, es <strong>de</strong>cir, tienen las mismas<br />
direcciones lineales. (2) Un objetivo <strong>de</strong> Linux es la portabilidad, y muchos procesadores soportan la<br />
segmentación <strong>de</strong> forma muy limitada.<br />
Para hacer uso <strong>de</strong> la segmentación, se programa a<strong>de</strong>cuadamente la GDT = Tabla <strong>de</strong> Descriptores Global.<br />
Esta tabla es implementada por el array gdt_table referenciada por la variable gdt, que se encuentra <strong>de</strong>finido<br />
en el archivo arch/i386/kernel/head.S.<br />
Los segmentos que se <strong>de</strong>finen se superponen en el espacio <strong>de</strong> direcciones lineal. Como se emplean muy<br />
pocos segmentos, solo es necesaria la GDT. La LDT no se usa por el kernel salvo que lo requiera un<br />
proceso, aunque existe una llamada al sistema que permite crear sus propias LDTs.<br />
Los segmentos empleados en Linux son los siguientes:<br />
• Segmento <strong>de</strong> código <strong>de</strong>l kernel.<br />
• Base: 0x00000000, Límite (limit): 0xfffff,<br />
• G = 1 (granularidad en páginas),<br />
• S = 1 (Segmento normal <strong>de</strong> código o datos),<br />
• Type = 0xa (Código, pue<strong>de</strong> ser leído y ejecutado),<br />
Departamento <strong>de</strong> Lenguajes y Computación. <strong>Universidad</strong> <strong>de</strong> Almería Página <strong>3.</strong>23