Está en la página 1de 18

Unidad 1: ARQUITECTURA DE LAS COMPUTADORAS PERSONALES

1.1) Características, Arquitectura básica de procesador Intel Pentium y


descripción funcional
Contiene dos pipelines, U y V. El U para instrucciones enteras y de punto flotante, el V para enteras simples y de
punto flotante FXCH. Capaces de ejecutar dos instrucciones enteras al mismo tiempo.

• Bus Unit: bus de dirección de 32 bits y de datos de 64 bits. Capaz de realizar lecturas y
escrituras en ráfagas de 32 bytes de memoria. Mediante el bus pipeling permite dos ciclos de
bus simultáneos.
• Caché de código: 8kB, da acceso rápido a instrucciones más usadas. Permite dos accesos
simultáneos desde el prefetcher.
• Unidad de decodificación de instrucciones: dos etapas D1 y D2.
• Unidad de control: interpreta la instrucción y entrada de microcódigo de D2. Maneja
excepciones, breakpoints e interrupciones, controla pipelines enteros y secuencias de punto
flotante.
• ALUs: provee 2 ALUs, una por pipeline. La del U puede completar y operar antes que la V.
• Generadores de dirección: uno por pipeline.
• Caché de datos: 8 kB, contiene copias de las solicitudes de datos más usadas por los pipelines.
Permite acceso simultáneo desde ambos pipelines.
• Unidad de paginación (modo protegido): traduce dirección lineal a física. Puede dar soporte a
ambos pipelines al mismo tiempo.
Modelo de programación en Modo Real
Solo las secciones sombreadas de la siguiente figura forman parte del modo real. Consiste en 8 registros de 16 bits y
8 de 32 bits. Accediendo al registro CR0 se puede entrar en modo protegido.

Direccionamiento de memoria en modo real


Memoria limitada a 1MB. Líneas de dirección A3 – A19 activas. El MB de
memoria no puede estar activo simultáneamente, la memoria se particiona
en segmentos de tamaño máximo de 64kB, cada cual representa una unidad
de memoria direccionable independiente. Cada segmento consiste en
ubicaciones de memoria consecutivas, con su propia dirección de inicio.

El registro de segmento posee las direcciones de inicio de los segmentos


activos. Solo 6 de 16 segmentos pueden estar activos a la vez.

La paginación no está activa en modo real, por lo que las direcciones lineales
son iguales a las físicas. Las físicas son generadas añadiendo el contenido de
registro de segmento apropiado, desplazado a la izquierda 4 bits para
agregar el offset (16 + 4 = 20 bits). En caso de acarreo a la dirección pasa a
ser de 21 bits.
Los segmentos pueden ser leídos, escritos o ejecutados. Si la dirección efectiva está más allá del rango legal (0 a
FFFFH) se lanza una excepción de protección general.

Todos los registros de segmento son accesibles a los programadores. Pueden usarse para establecer a los segmentos
contiguos, adyacentes, inconexos o solapados.

Manejo de interrupciones y excepciones en modo real


Las ubicaciones de memoria desde 0 a 3FFH (400H
ubicaciones) son dedicadas a la IDT. La IDT contiene
punteros al inicio de las rutinas de servicio de interrupción.
Cada puntero requiere 4 bytes de memoria, por lo que
contiene 256 punteros. Los 2 bytes más significativos
contienen la dirección base del segmento, los otros 2 el
offset. Al ocurrir una interrupción, se multiplica el
numero/tipo de interrupción por 4 generando un índice en
la IDT.

La IDT es reubicable. Su dirección base se encuentra en el


IDTR y al igual que su tamaño, puede modificarse
mediante la instrucción LIDT.

Pipeling
Posee 2 instrucciones pipeling (U y V). Se trata de pipelines de 5 etapas independientes, las cuales son:

• PF Prefetch
• D1 Decodificación de instrucción
• D2 Generación de instrucción
• EX Ejecución, acceso a cache y ALU
• WB Writeback (respuesta)

El pipeline U puede ejecutar cualquier instrucción, el V solo instrucciones simples (sin control de microcódigo1 y
normalmente de 1 solo ciclo de reloj).
1. Etapa PF: precarga de instrucciones a ambos pipelines.
2. Etapa D1: decoder, comprueba si el par de instrucciones actual puede ejecutarse a la vez.
3. Etapa D2: cálculo de direcciones de operandos residentes en memoria.
4. Etapa EX: lectura de operandos y ejecución de las operaciones de las ALUs.
5. Etapa WB: escritura del resultado de la instrucción y verificación de predicción de rama.

1.2) Modo Protegido


Se ingresa a este modo seteando el bit 0 del registro CR0. Aquí se desbloquean todas las capacidades del procesador.

Las características de este modo son:

• Más líneas de direccionamiento y memoria (4 GB), memoria virtual (64 TB).


• Gestor de memoria y protección asistida por hardware.
• Instrucciones especiales para multitasking.
• Paginación.

Registros de soporte en modo protegido


El procesador apenas inicia me da la dirección base y el límite, aunque sea para acceder a un segmento.

1. Registro de la Tabla de Descriptores Globales (GDTR) - 48 bits: Contiene la dirección base de 32 bits y el límite de
16 bits de la Tabla Global de Descriptores (GDT).

2. Registro de la Tabla de Descriptores de Interrupción (IDTR) - 48 bits: Contiene la dirección base lineal de 32 bits y
el límite de 16 bits de la tabla de descriptores de interrupción (IDT).

3. Registro de la tabla de descriptores locales (LDTR) - 16 bits: Contiene el selector de 16 bits para el Descriptor de
la Tabla de Descriptores Locales.

4. Registro de tareas (TR) - 16 bits: Contiene el selector de 16 bits para el descriptor del segmento de estado de la
tarea
Traslación de direcciones lógicas a físicas
El procesador Pentium tiene tres espacios de direcciones distintos: Lógico, lineal y físico. Una dirección lógica
consiste en un selector y un offset. Un selector es el contenido de un registro de segmento.

Un selector es el contenido de un registro de segmentos. Cada selector de segmento tiene una dirección de base
lineal asociada a él, que se almacena en el descriptor de segmentos. Un selector se usa para apuntar al descriptor de
segmentos en la tabla de descriptores. La dirección base lineal del descriptor de segmentos es entonces sumada a
los 32-bit del offset para generar la dirección lineal de 32-bit.

Fig. 1 Descripción general de la traslación de direcciones


Este proceso se conoce como segmentación o traslación de segmentos. Si la unidad de paginación no está habilitada,
la dirección lineal de 32 bits corresponde a la dirección física. Pero si la unidad de paginación está habilitada, el
mecanismo de paginación traslada el espacio de direcciones lineales al espacio de direcciones físicas mediante la
traslación de paginación.

Segmentación (Lógica → Lineal)


La segmentación es un proceso de conversión de la dirección lógica en una dirección lineal. El selector es usado para
acceder al descriptor en una tabla de descriptores. Los 13-bits de índice del selector se multiplica por 8 y es usada
como un puntero para el descriptor deseado, esto se hace porque cada descriptor es de 8 bytes.

El descriptor, de la tabla de descriptores contiene principalmente la dirección base, el límite de segmento y el byte
derechos de acceso. El procesador suma la dirección base del descriptor a la dirección efectiva u offset para generar
la dirección lineal para acceder a la ubicación exacta de mi segmento.
La componente del selector contiene dos bits que son para el nivel de privilegio, es decir cuando se quiere acceder a
un segmento la unidad de gestión de memoria (MMU) compara el nivel de privilegio del selector con el descriptor al
cual se quiere acceder. Si el nivel de privilegio solicitado concuerda o tiene mayor prioridad que el nivel de privilegio
establecido por el byte de derechos de acceso, se otorga el acceso.

Hay dos categorías principales de tablas de descriptores:

- La Tabla de Descriptores Global (GDT) es una tabla de descriptores de propósito general, puede ser utilizada
por todos los programas para referenciar segmentos de memoria.

- Mientras que una Tabla de Descriptores Locales (LDT) es usada para para tareas individuales del sistema.

El bit indicador de tabla (TI) en el selector decide a qué tabla de descriptores debe referirse el selector, selecciona ya
sea la tabla de descriptores globales (TI = 0) o la tabla de descriptores locales (TI = 1).

Descriptores de segmento y gestión de la memoria mediante segmentación


En modo protegido, la unidad de gestión de memoria (MMU) usa el selector de segmentos para acceder a un
descriptor deseado en la tabla de descriptores, el descriptor de segmento es una estructura especial que describe al
segmento, exactamente cada descriptor de segmento debe estar referido para cada segmento en memoria.

Los descriptores de segmentos proporcionan algunos atributos. Para la dirección base se concatena las dos
direcciones base de abajo y luego las de arriba formando la dirección base de 32bits.
Los descriptores contienen los siguientes atributos:

• Base: 32 bits de dirección lineal base del segmento. Define la dirección dentro del espacio lineal de 4 GB.
• Limit: 20 bits de tamaño de segmento. Este valor se interpreta dependiendo del valor del bit G.
• G (Granularity): define la unidad de medida del limit
o 𝐺=0→𝑏𝑦𝑡𝑒𝑠
o 𝐺=1→4𝑘𝐵
• D (Default Size): define el tamaño de los operandos del segmento.
o 𝐷=0→ 16 bits.
o 𝐷=1→ 32 bits.
• 0 (Reservado por Intel): compatibilidad a futuro.
• AVL/U (User bit): indefinido, disponible para usuario o SO.

ACCESS RIGHT BYTE

• P(Present bit): es 1 si el segmento está cargado en memoria.


• DPL: nivel de privilegio del espacio de memoria que define el descriptor.
• S (System bit): indica si un segmento es de sistema (0) o código (1).
• Type
• A (Accessed bit): seteado cada vez que se accede al segmento.

Descriptores de segmentos del sistema


LDT descriptor: Son presentados únicamente en la GDT, contienen información sobre LDT, el DPL de este descriptor
es ignorado ya que se puede ser accedido con un nivel de privilegio 0.
TSS descriptor: Realiza más de una tarea a la vez y también cambia entre las tareas. Almacena toda la información
necesaria cuando se cambia de una tarea 1 a una tarea 2 para poder luego retomar donde se había dejado.
Descriptor de puerta: Es un tipo de descriptor especial que permite al procesador Pentium realizar chequeo de
protección tenemos 4 tipos de descriptores de puerta:
Call Gate: Se usa para cambiar de niveles de privilegio
Task Gate: Realiza cambios de tareas
Interrupt Gate: Especifica ISR
Trap Gate: Especifica ISR

Tablas de Descriptores
El límite máximo para la longitud de la tabla de descriptores es de 64KBytes y sabemos que cada descriptor toma 8
bytes para almacenar la información de un segmento particular. Así que la tabla de descriptores puede tener hasta
8192 descriptores.

Tipos de tablas descriptoras:


• Tabla global de descriptores (GDT): Es una tabla de propósito general, que puede ser utilizada por todos los
programas para referenciar segmentos de memoria.
• Tabla de descriptores locales (LDT): Se configuran en el sistema para una tarea individual.
• Tabla de descriptores de interrupción (IDT): Contiene los descriptores de segmento que definen las rutinas
de manejo de excepciones de las interrupciones.

Registro de tabla de descriptores global (GDTR): El


contenido de GDTR es usado para definir la GDT en el espacio
de direcciones de memoria física del procesador
Pentium, ya que especifica el límite y la base, es decir la
cantidad de descriptores.

Registro de la tabla de descriptores de interrupción (IDTR): Es igual


que GDTR, pero para IDT.

Registro de la tabla de descriptores local (LDTR): Es un registro de 16-bits no de 48-bits como las anteriores, no
especifica ni el límite ni la base, pero especifica la dirección del descriptor para la LDT almacenada en la GDT.
Contiene un selector que apunta a un descriptor en la GDT, este descriptor define el inicio de la tabla con los 32 bits
de dirección lineal base y el tamaño de la tabla con los 16 de límite.

La GDT puede tener varios descriptores LDT. Para poner en servicio uno en particular, debe cargarse el registro LDTR
con el selector correspondiente.
Primero debo tener el bit TI puesto en 1 y luego de usar el Selector de LDTR para que apunte al descriptor de la LDT
de GDT que me da mi limite y base, vuelvo al selector normal para que apunte a la LDT ya que este tiene la dirección
de base lineal asociada al descriptor de segmento de la LDT, y de ahí sumar la dirección de base lineal con el offset
para obtener mi dato.

LDTR almacena un selector que apunta al descriptor de LDT en la GDT (Direccionamiento indirecto). Cuando un
selector es cargado en el LDTR el correspondiente descriptor se localiza en la GDT (Digamos que el selector que se
cargó apunta al descriptor de LDT en GDT), el contenido de este descriptor define la LDT.

Como sabemos ya, un selector es el contenido de un registro de segmento el cual apunta a un descriptor en la tabla
de descriptores. Esta parte del registro de segmentos es visible para el programador, pero también tiene una parte
oculta la cual está referida como registro cache del descriptor de segmento. Utilizando estos registros el procesador
Pentium almacena la información del descriptor, evitando así la necesidad de consultar una tabla de descriptores
cada vez que se accede a la memoria. El contenido del registro de segmento (parte visible) es manipulado por los
programas, mientras que el contenido del registro de caché del descriptor de segmento (parte oculta) es manipulado
por el procesador. Una vez que los descriptores se almacenan en la caché, las subsiguientes referencias a ellos se
realizan sin ninguna sobrecarga para la carga del descriptor.

Paginación (Lineal → Física)


La paginación es la segunda fase de la traslación de direcciones, transforma una dirección lineal en una dirección
física (este paso es opcional). Tiene efecto únicamente cuando el bit PG del registro CR0 está habilitado.

El objetivo de este esquema de dos niveles es reducir la cantidad de RAM necesaria para las tablas de páginas por
proceso. Cuando la paginación está habilitada la unidad de paginación organiza el espacio de la dirección física, que
se organiza en 2^20 páginas de 4Kbytes.

Registro y tablas de soporte


Hay 3 componentes para el mecanismo de paginación:

• El directorio de páginas: Tiene forma de tabla y está formada por descriptores de 32 bits y deben contener
1024 descriptores debido a su tamaño de 4Kbytes.
• Tablas de páginas: Tiene forma de tabla y está formada por descriptores de 32 bits y deben contener 1024
descriptores debido a su tamaño de 4Kbytes.
• Marco de páginas: Es una entidad de 4Kbytes de direcciones contiguas de memoria física.

El procesador utiliza dos niveles de tablas para trasladar la dirección lineal en una dirección física (La primera tabla
de traslación se llama Directorio de páginas y la segunda se llama Tabla de páginas). El procesador divide
internamente una dirección lineal en tres campos: Dos campos de 10 bits cada uno y un campo de 12 bits.

Los 10 bits más significativos (campo DIR) de la dirección lineal se utilizan como índice en un directorio de páginas.
Los siguientes 10 bits más significativos (campo PAGE) de la dirección lineal se utilizan como índice en la tabla de
páginas determinada por el directorio de páginas.

Los 12 bits menos significativos (OFFSET) seleccionan uno de los 4 Kbyte de memoria del marco de páginas
determinado por la tabla de páginas. La dirección física del directorio de páginas actual se almacena en el registro de
control (CR3) que también se denomina registro base del directorio de páginas (PDBR). Cuando arranca el
procesador genera una dirección del directorio de página y la almacena en PDBR.
El descriptor de un directorio de páginas se denomina Entrada de directorio de páginas (PDE) y el descriptor de la
tabla de páginas se denomina Entrada de tabla de páginas (PTE).

En la siguiente imagen se muestra el proceso completo de traducción de una dirección lógica a una dirección física
con el método de paginación (SIN TLB):

1. El programa en assembler quiere acceder a una dirección y coloca el selector y el offset. El offset es de 32
bits porque puede ser cualquier cosa (PC, reg, etc.). El offset y los descriptores están en RAM.
2. El índice del selector se multiplica por 8 porque el descriptor requiere de 8 Bytes.
3. El CPU comprueba los permisos con el RPL y el DPL. Si se cumple que RPL <= que DPL se puede acceder al
descriptor y usando la base + offset se llega a la dirección lineal.
4. Si la paginación esta OFF esta dirección lineal es igual a la dirección física. Si no, se hace la traslación.
5. Partiendo del CR3 se usan los 10 bits de DIRECTORY como offset dentro de una tabla que se llama directorio
de página, y acá con estos 10 bits puedo tener una entrada de unas 1024 posibles entradas de tabla de
directorio. Supongamos que direcciona a PDE, donde esta tiene la dirección base de la TABLA DE PAGINA.
6. Con los bits PAGE hace un offset y obtiene una entrada en la TABLA DE PAGINA que le llama PTE, y esto tiene
la dirección base de un MARCO DE PAGINA que esto si sería la memoria física.
7. Con los bits OFFSET más la dirección base del marco de página yo me muevo algún Byte de la memoria física
que yo quería.

DATO: Se necesitan 4 accesos a memoria para acceder al dato.


Cache de Traslación de Pagina (TLB)
Para que el procesador en cada acceso de memoria no tenga que pasar por los dos niveles de tabla, el procesador
almacena las entradas de tablas de páginas usadas recientemente (PDE y PTE), en una cache llamada TLB, esta
almacena hasta 32 entradas de tabla páginas. Cuando el procesador genera una dirección lineal que mapea a la
entrada de tabla de páginas (PTE) ya almacenadas en la cache, el procesador puede usar esta información para llegar
al segmento del marco de página, pero solo compara los primeros 20 bits en el TLB.

Operación de paginación

El mecanismo de paginación obtiene una dirección lineal de 32-bits desde la unidad de segmentación. Los 20 bits
superiores de la dirección lineal (Campo de Directorio y Campo de página) son comparados con las 32 entradas del
TLB de 4Kbyte de tamaño cada una para determinar si hay alguna coincidencia, si hay una coincidencia entonces los
32 bits de la dirección física son calculados y es almacenada en el bus de direcciones. Es necesario cambiar las
entradas de la cache cuando las tablas de página son cambiadas, esto se puede hacer realizando un cambio de tareas
para que tengan un diferente CR3, o moviendo el contenido de CR3 a EAX.
1.3) Protección
El procesador utiliza mecanismos de protección a nivel de segmento y a nivel de privilegio para proteger las
secciones críticas.

Protección Por Segmentación


Cuando se intenta acceder a un segmento en primer lugar, el procesador comprueba si la tabla de descriptores
indexada por el selector contiene un descriptor válido para ese selector. Si el selector intenta acceder a una
ubicación fuera del límite de la tabla de descriptores o la ubicación indexada por el selector en la tabla de
descriptores no contiene un descriptor válido, se produce una excepción. El procesador también comprueba si el
descriptor de segmento es del tipo adecuado para ser cargado en la caché.

Si se cumplen todas las condiciones de protección anteriores, los bytes de límite, base y derechos de acceso del
descriptor del segmento se copian en la parte oculta del registro del segmento. El procesador Pentium comprueba
entonces el bit P (presente) del byte de acceso para ver si el segmento para ese descriptor está presente.

Después de que un selector de segmento y un descriptor son cargados en el registro de segmento, chequeos
adicionales se realizan cada vez que una ubicación en el segmento actual es accedida. Estos chequeos son de tipo y
de límite.

Chequeo de tipo: Es usado para detectar cuando algún programa está intentando usar segmentos de modos no
especificados para el programador.

Chequeo de límite: El campo de límite del descriptor de segmentos es utilizado para evitar que los programas se
dirijan fuera de los segmentos, es decir que el offset más la base no exceda el tamaño.

Protección Por Nivel de Privilegios


Tiene 4 niveles de privilegio, el nivel cero representa el nivel de privilegio más alto.
Nivel de privilegio del descriptor al cual queremos acceder (DPL)
Nivel de privilegio solicitado donde quiero ir (RPL)
Nivel de privilegio actual que es el descriptor almacenado en la parte
oculta de la cache (CPL)
Para poder acceder a mi descriptor de segmentos la CPU compara
estos 3 niveles de privilegios los cuales tienen que cumplir la siguiente
condición (𝐶𝑃𝐿, 𝑅𝑃𝐿) ≤ 𝐷𝑃𝐿 (𝑁𝑢𝑚𝑒𝑟𝑖𝑐𝑎𝑚𝑒𝑛𝑡𝑒) para poder acceder al
segmento.

Protección por restricción de acceso a los segmentos


Cuando se intenta acceder a un segmento cargando un selector
de segmento en la porción visible del data segment register.
El procesador chequea tres tipos distintos de niveles de privilegio CPL, DPL, RPL.
El procesador puede cargar el registro de segmento de datos únicamente si el DPL del descriptor de segmentos de
datos (al cual yo quiero acceder apuntando con mi selector cargado en la parte visible de mi registro de segmentos
que tiene un nivel RPL) solicitado es numéricamente mayor o igual al máximo del CPL y el RPL.

Call Gate
La necesidad de usar call gate es que yo necesito saltar de un nivel de privilegio menor a uno mayor. Cuando hago un
CALL mi selector ya no apunta a un descriptor de segmentos si no que apunta a un descriptor de puerta el cual
contiene un selector y un offset, para acceder a dicho descriptor de puerta se tiene que cumplir que (𝐶𝑃𝐿, 𝑅𝑃𝐿) ≤
𝐷𝑃𝐿 𝑑𝑒 𝐺𝑎𝑡𝑒 (𝑁𝑢𝑚𝑒𝑟𝑖𝑐𝑎𝑚𝑒𝑛𝑡𝑒), si se cumple esto entonces el descriptor se carga en la porción oculta del registro
de segmentos y el selector en la parte visible por lo cual ahora mi CPL = DPL de Gate y mi RPL = DPL Objetivo,
por ejemplo si quiero ir de un PL = 3 a PL = 0 mi DPL de Gate = 3 o 4 para poder acceder al descriptor de puerta,
entonces una vez que accedí se carga mi selector del descriptor de puerta en la parte visible con un RPL =0 debido a
que apunto a un descriptor de segmento que está en PL = 0 y en la parte oculta se copia mi descriptor de puerta por
lo tanto mi CPL = 3 o 4 y el DPL Objetivo = 0 del descriptor de segmento que quiero acceder si la comparación de la
CPU cumple que 𝐷𝑃𝐿 𝑂𝑏𝑗𝑒𝑡𝑖𝑣𝑜 ≤ (𝐶𝑃𝐿, 𝑅𝑃𝐿) ≤ 𝐷𝑃𝐿 𝑑𝑒 𝐺𝑎𝑡𝑒 (𝑁𝑢𝑚𝑒𝑟𝑖𝑐𝑎𝑚𝑒𝑛𝑡𝑒). Entonces accedo a mi descriptor
en el cual obtengo la dirección base lineal y se la sumo al offset que contiene el descriptor de puerta, pudiendo así
acceder a mi segmento de código que una vez que se ejecutó todo me retorna un valor a mi programa en el cual se
hizo la llamada.
En resumen, los Call Gates:

• Se definen como descriptores de segmento.


• No definen espacio de memoria.
• Se ubican en tablas de descriptores.
• Son el único medio para alterar el CPL.
• Definen puntos de entrada a otros niveles de privilegio.
• Se invocan desde instrucciones CALL.

Durante este proceso, la validez de la transferencia de control se chequea usando 4 niveles de privilegio diferentes:

1. CPL
2. RPL del selector usado para especificar el Call gate.
3. DPL del descriptor de gate.
4. DPL del descriptor del segmento ejecutable de destino.

Para que la transferencia de control sea válida, debe cumplirse numéricamente para la instrucción CALL:

𝐷𝑃𝐿𝑑𝑒𝑠𝑡𝑖𝑛𝑜≤max(𝑅𝑃𝐿,𝐶𝑃𝐿)≤𝐷𝑃𝐿𝑔𝑎𝑡𝑒

Manejo de interrupciones en modo real y protegido


Para el manejo de interrupciones el Procesador Pentium proporciona dos tipos especiales de controles de
trasferencia: Interrupciones y excepciones
1) Interrupciones
Las interrupciones son usadas para el manejo de eventos externos asíncronos para el procesador
(Hardware)
Ocurren por el resultado de un evento externo, son atendidas después de la ejecución de la instrucción actual.

2) Excepciones
Las excepciones manejan las condiciones detectadas por el procesador mismo en el curso de ejecución de
instrucciones

Modo real
Hay una tabla la cual contiene punteros que definen el comienzo de ISR. Cada puntero representa dos palabras. La
palabra que tiene la dirección de memoria más alta contiene la dirección base del segmento y la que contiene la
dirección en memoria más baja contiene el offset. Cada vez que una interrupción ocurre el procesador multiplica el
numero de la interrupción por 4 para generar un índice en la IDT.

Modo Protegido
Ahora la IDT es un arreglo de descriptores de 8-byte y cuando una interrupción ocurre, su identificador que es un
número se multiplica por 8 y se suma a la dirección base de IDT almacenada en IDTR. El resultado me apunta a un
descriptor de puerta en la IDT que puede ser de 3 tipos (interrupt gate, trap gate, task gate). Este descriptor contiene
un selector y un offset, de modo que el selector apunta al descriptor de segmento que queremos acceder
obteniendo la dirección de base lineal que le sumamos el offset de la puerta para así obtener la dirección lineal y
acceder al segmento donde se encuentra la ISR (rutina de servicio de interrupciones) que se ejecuta y luego se
retorna al programa

1.4) Multitarea
Compartición de Tiempo: en sistemas multiusuario, el ordenador atiende a un solo usuario durante un breve
periodo de tiempo. A cada usuario le asigna una franja de tiempo.

● Permite múltiples usuarios

● Provee uso económico de recursos

● Invisible al usuario

● Múltiples usuarios a la vez

Multiusuario vs Multitarea

● PC multiusuario: puede hacer varias tareas por usuario

● PC multitarea: puede hacer varias tareas para UN usuario

Métodos de planificación para sistemas operativos multiusuario


Time-Slice Scheduling (porción de tiempo)
Determina cuando es el tiempo para cambiar de una tarea a otra, este componente específico se llama Scheduler
(Planificador).
Ventaja: Todos los usuarios son atendidos al mismo tiempo
Desventaja: Mientras más usuarios, se le asigna menos tiempo a cada uno.
Pre-emptive-Priority Bases Scheduling (Por prioridad)
Las tareas de mayor prioridad permiten interrumpir las tareas de menor prioridad, y una vez ejecutadas retornar a la
tarea de menor prioridad para terminarla.
Context Switching (Cambio de contexto)
Cada tarea usa registros (data pointers, memory pointers, etc.). A todo esto, se lo asigna como entorno o contexto
de esa tarea.

Cuando el cambio de tarea ocurre el contenido debe ser guardado, usualmente se guarda el puntero a el contenido
en un segmento especial de la memoria o en la pila, para luego cuando retome la tarea de nuevo el sistema
operativo use de nuevo el puntero para acceder al contenido guardado.

Registros de soporte y descriptores relacionados a multitareas.


Segmento de estado de tareas (TSS): Es un tipo especial de segmento, utilizado para gestionar la tarea, el
procesador lo usa como un block de notas, ósea que aquí se almacenan el contenido o contexto de una tarea. Se
divide en dos sets:

• Set dinámico: Se actualiza cada vez que el CPU cambia de tarea, guardan el estado del CPU. Incluye:
o Registros generales
o Registros de segmentos
o Registros de bandera: permiten ejecutar sentencias y saltos condicionales
o Puntero de instrucción: permite reiniciar la tarea donde se la detuvo
o Link de retorno: permite volver a la tarea anterior

• Set Estático: El CPU solo lee estos registros. Incluye:


o Selector para la LDT de la tarea
o PDBR o CR3: contiene la dirección base del directorio de páginas de la tarea.
o Punteros a stack de privilegios 0 a 2
o T-BIT: pone en modo debug al cpu
o I/O map offset.

TSS Descriptor: Al igual que otros segmentos, el segmento de estado de la tarea se define mediante un descriptor
llamado descriptor TSS.

Registro de tareas (TR): Es un selector para el TSS, tiene una porción visible que es la que se usa para especificar el
TSS descriptor en la GDT y la porción invisible se usa para almacenar en cache la base y el valor límite del TSS
descriptor, esto hace que no tenga que ir a buscar los valores en memoria cuando se hace referencia al TSS de una
tarea actual.

Task Gates y Task Gate Descriptor


Task Gates: tiene su propio descriptor y no define un segmento en la memoria, pero actúa como un punto de
interface entre el código de usuario y un TSS.
Task Gate Descriptor: define un selector para un TSS descriptor únicamente identificando una tarea.
Podemos decir que el DPL de un Task Gate permite el cambio de tarea de un nivel bajo a un nivel alto

Task Switching (cambio de tarea)


Después de un cambio de tarea es decir después de cargar un nuevo contexto desde un TSS y actualizar el TR. El
procesador marca como ocupado el nuevo TSS. Por lo tanto, la tarea actual en ejecución siempre es una tarea ocupada.
Como no puede realizarse un cambio de tarea a una tarea ocupada, las tareas no son reentrantes, es decir, los cambios de
tarea no son recursivos.

El procesador realiza cambios de tarea en cualquiera de los siguientes casos:

• LONG JMP o CALL con un selector que referencia a un descriptor TSS.


• Selector en una instrucción LONG JMP o CALL referido a un Task Gate.
• Selector de interrupción referido a un Task Gate en la IDT.
• Ejecución de instrucción IRET (retorno de interrupción) con el bit NT del registro EFLAGS activado.
Cambio de Tareas sin Task Gate
Los pasos son los siguientes:

1. Comprobación de Privilegios: Esto se hace verificando DPL del TSS designado con RPL y CPL de la tarea
actual.
2. Comprobación de los bits de límite y de presencia.
3. Guardar el estado de la tarea actual: Encuentra la dirección base de la TSS actual almacenada en caché en
el registro de tareas y copia los registros en el TSS actual. El selector de la tarea actual se guarda como
selector de enlace posterior (back link) en la nueva tarea.
4. Carga del registro de tareas: La parte visible del registro de tareas se carga con el selector del descriptor TSS
de la tarea designada. Esto establece el bit TS (Cambio de tarea) en la Palabra de Estado de la Máquina
(MSW).
5. Reanudación de la ejecución.

Cambio de Tareas con Task Gate


Se utiliza el método indirecto, en el cual la conmutación se realiza mediante un
JMP o CALL a un Task Gate. Consiste en los siguientes pasos:

1. El DPL del nuevo descriptor no se usa, se usa el DPL del Task Gate
comparándolo con el CPL y RPL de selector de Gate.
2. Los pasos siguientes son similares, salvo que para cargar el selector
del descriptor TSS en el TR se remita a la instrucción CALL o JMP.

En caso de excepciones, interrupciones e IRETs, se permite el cambio de tarea.

Tareas Anidadas
Si el cambio de tarea fue por una instrucción FAR CALL o una excepción, falla o trampa, la nueva tarea se
considera anidada a la antigua. Cuando se ejecuta una instrucción IRET el procesador vuelve a la tarea que
la invocó. Para ello existe un mecanismo de vinculación de tareas, el cual consiste en el Back Link y la
bandera de tarea anidada NT. Pentium usa el campo NT como bandera para saber si el campo Back Link de
la TSS actual es válido. Este es el único medio por el que Pentium determina si debe realizar un cambio de
tarea o un IRET normal.
Cambios en tareas anidadas:
• Las tareas anidadas actúan como subrutinas.
• CALL a Task Gate anida tareas.
• Interrupción o Excepción a Task Gate anida tareas.
• JMP no anida tareas.
• La nueva TSS obtiene el selector de la antigua TSS en Back Link.
• La nueva tarea obtiene el bit de tarea anidada en el registro EFLAGS.
• La nueva tarea debe volver a la tarea anterior con la instrucción IRET.

También podría gustarte