Materia: #organizacion_del_computador_II

Tags: Memoria, Segmentación y paginación

Descriptores de segmento

Cuando tenemos una memoria que funciona bajo el modelo de segmentación tenemos que tener en cuenta como se representan las direcciones de dicha memoria. En particular, las direcciones de un segmento consisten en dos partes escenciales: el selector de segmento, y un offset. A esa dirección la llamaremos dirección lógica.

El selector de segmento nos indicara en que porcion de la memoria tenemos que buscar. Generalmente se representa como un numero de 16 bits, permitiendonos representar a lo sumo 64K de tamaño. El offset, por otro lado, consiste en un numero entre 0 y el tamaño del segmento en cuestion. Se comporta como un indice en una lista, permitiendo acceder al dato especifico que se esta buscando dentro del segmento. Si el offset es 0, entonces se esta haciendo referencia a la dirección en la que el segmento empieza. En la maquina de Intel 64, el offset consiste en 64 bits.

Ahora bien, la magia del selector de segmento consiste en que nos indica el segmento pero en base a una tabla: la GDT (Global Descriptor Table). Es decir, el selector de segmento tambien se comporta como un indice, igual al offset, pero para indicarnos que segmento se esta buscando en base a una tabla que tiene descriptores de segmento.

Los descriptores de segmento, como su nombre indica, son secuencias de bits que nos brindan información del segmento en cuestión. Nos indican parte de su dirección real (a la que tambien llamamos dirección lineal), aparte de otros datos como los permisos que se necesitan para acceder, si se puede leer o escribir, si se encuentra presente (es decir, disponible), entre otros datos.

gdt.png

Mapa de como se transforma la dirección lógica de un dato, a su dirección fisica dentro de la computadora.

El descriptor de segmento mas de cerca se ve asi:

descriptorDeSegmento.png

Donde:

En la practica, para poder abarcar toda la memoria se implementa la idea de LDT (o Local Descriptor Table). Es decir, la GDT ya no guarda descriptores de segmentos, lo que guarda son descriptores de tablas locales de segmentos, donde a su vez se guardan los descriptores de segmento para poder encontrar la dirección lineal.

LDTandGDT.png

Grafio mostrando el circuito real entre la dirección lógica, la GDT, la LDT y la dirección lineal.

Los descriptores de segmento y los descriptores de tablas de segmento como tal no tienen mucha diferencia. Lo mas notable es que en el bit 11, justo despues del bit de sistema, tienen 4 bits donde se les declara un tipo acorde a la siguiente tabla:

11 10 9 8 Modo 32 bits
0 0 0 0 Reservado
0 0 0 1 TSS de 16 bits disponible
0 0 1 0 LDT
0 0 1 1 TSS de 16 bits busy
0 1 0 0 Call gate de 16 bits
0 1 0 1 Task gate
0 1 1 0 Interrupt gate de 16 bits
0 1 1 1 Trap gate de 16 bits
1 0 0 0 Reservado
1 0 0 1 TSS de 32 bits disponible
1 0 1 0 Reservado
1 0 1 1 TSS de 32 bits busy
1 1 0 0 Call gate de 32 bits
1 1 0 1 Reservado
1 1 1 0 Interrupt gate de 32 bits
1 1 1 1 Trap gate de 32 bits