12.10.2014 Views

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

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!