Download Mecanismo de Interrupciones

Document related concepts

Sistema operativo wikipedia , lookup

Interrupción wikipedia , lookup

Proceso de arranque en Linux wikipedia , lookup

Llamada de interrupción del BIOS wikipedia , lookup

Núcleo (informática) wikipedia , lookup

Transcript
BIOS
¿ Qué es la BIOS ?
La BIOS (Basic Input Output System, Sistema de entrada/salida básico) es una
memoria ROM, EPROM o FLASH-Ram la cual contiene las rutinas de más bajo
nivel que hace posible que el ordenador pueda arrancar, controlando el teclado,
el disco y la disquetera permite pasar el control al sistema operativo.
Además, la BIOS se apoya en otra memoria, la CMOS (llamada así porque suele
estar hecha con esta tecnología), que almacena todos los datos propios de la
configuración del ordenador, como pueden ser los discos duros que tenemos
instalados, número de cabezas, cilindros, número y tipo de disqueteras, la fecha,
hora, etc..., así como otros parámetros necesarios para el correcto
funcionamiento del ordenador.
Esta memoria está alimentada constantemente por una batería, de modo que,
una vez apaguemos el ordenador no se pierdan todos esos datos que nuestro
ordenador necesita para funcionar.
Ahora todas las placas suelen venir con una pila tipo botón, la cual tiene una
duración de unos 4 ó 5 años (aunque esto puede ser muy variable), y es muy
fácil de reemplazar. Antiguamente, las placas traían una pila corriente soldada en
la placa base, lo que dificultaba muchísimo el cambio, además de otros
problemas como que la pila tuviera pérdidas y se sulfataran ésta y la placa.
Además, la BIOS contiene el programa de configuración, es decir, los
menús y pantallas que aparecen cuando accedemos a los parámetros del
sistema, pulsando una secuencia de teclas durante el proceso de
inicialización de la máquina.
EL NÚCLEO
El núcleo (kernel) del sistema operativo constituye el nivel más bajo de éste y
proporciona un interfase
entre el hardware y el resto de niveles del sistema operativo (Figura 1). Su finalidad
principal es constituir un entorno adecuado en el que se puedan ejecutar los
procesos. Esto implica gestionar los recursos básicos del sistema y proporcionar
servicios esenciales para los programas de aplicación y usuarios:
· Gestión de recursos básicos:
-Gestión de memoria.
- Creación de procesos y planificación de los mismos.
- Mecanismos para la intercomunicación entre procesos.
- Mecanismos básicos de entrada/salida.
· Servicios para las aplicaciones y usuarios:
- Autentificación de usuarios y control de los accesos a los recursos por parte de
los procesos.
-Gestión de ficheros.
El núcleo está constituido directamente sobre el hardware, por lo que es la parte del
sistema operativo más dependiente de la máquina y constituye, normalmente, la
parte del sistema operativo que obligatoriamente debe de contener código en
ensamblador. El resto del sistema puede ser escrito en un lenguaje de más alto nivel,
lo que facilita el desarrollo y mantenimiento del mismo. Desde la aparición del
sistema operativo UNIX, el lenguaje C suele ser el lenguaje en el que desarrollan los
sistemas operativos
Requisitos Hardware
El núcleo necesita unos requisitos mínimos de hardware para poder llevar a cabo
sus funciones. Estos requisitos incluyen:
· Mecanismo de interrupciones.
· Protección de memoria.
· Repertorio de instrucciones reservadas.
· Reloj de tiempo real.
Mecanismo de Interrupciones
El hardware ha de suministrar un mecanismo por el que se pueda interrumpir el
funcionamiento normal de la CPU. Las interrupciones son necesarias,
fundamentalmente, porque permiten mejorar el aprovechamiento de la CPU
mediante la aplicación de diversas técnicas (multiprogramación, tiempo compartido,
etc.). Las principales fuentes de interrupciones son:
· Programas: como consecuencia de la ejecución de una instrucción, se producen
algunas de las siguientes situaciones: overflow, divisiones por cero, referencias a
direcciones de memoria que no pertenecen al espacio de direcciones del proceso,
etc.
· Reloj del sistema: cada computador tiene un reloj que interrumpe a la CPU a
intervalos regulares. De esta forma es posible, por ejemplo, utilizar políticas de
planificación apropiativa (preemptive scheduling).
Dispositivos de entrada/salida: los controladores de dispositivo generan
interrupciones cuando se completa una operación o cuando se produce algún error.
Fallos del hardware: errores de paridad de memoria, caída de la fuente de
alimentación, etc.
El mecanismo de interrupciones funciona, generalmente, del siguiente modo. Cada
tipo de dispositivo de entrada/salida tiene asociado una dirección de memoria
conocida como vector de interrupciones, que contiene la dirección de una rutina que
se ejecutará en el caso de que se produzca la interrupción correspondiente. Cuando
un dispositivo envía una señal de interrupción al procesador, éste termina la ejecución
de la instrucción en curso, determina la fuente de la interrupción, localiza su vector de
interrupciones y ejecuta la rutina de tratamiento de la interrupción. Al terminar esta
rutina el núcleo suele aplicar la política de planificación de procesos, lo que puede
originar que el proceso que continué con su ejecución o bien que se ejecute otro
diferente. Cuando un proceso es interrumpido, el núcleo ha de guardar toda la
información necesaria para poder reanudar posteriormente su ejecución. Esta
información incluye, como mínimo, el contador de programa y el resto de registros de
la CPU.
Es posible que durante la ejecución de una rutina de tratamiento de una interrupción
se produzca otra. Existen dos alternativas para tratar este tipo de situaciones. La
primera consiste en desactivar las interrupciones mientras se está procesando una
rutina de tratamiento de interrupciones. Si se producen nuevas interrupciones en esos
periodos, normalmente se dejan pendientes y son tratadas cuando se vuelven a
rehabilitar. La principal ventaja de este esquema es su simplicidad, ya que las
interrupciones se atienden en orden estrictamente secuencial. El inconveniente es que
no permite establecer prioridades entre interrupciones, lo que es necesario en
determinadas situaciones. La segunda alternativa es, precisamente, el
establecimiento de prioridades y permitir la interrupción de rutinas de tratamiento
cuando se generan otras de mayor prioridad.
Núcleos Monolíticos y Micronúcleos (Microkernels)
Las funciones concretas del núcleo van a depender en gran medida de la
arquitectura del sistema operativo. Tradicionalmente, los sistemas operativos
poseen un núcleo monolítico que suministra la mayoría de los servicios
directamente, a través de las llamadas al sistema. El término monolítico implica, no
tanto que el núcleo del sistema operativo sea de gran tamaño, sino que esté
codificado de forma no modular. Como consecuencia, la alteración de cualquier
componente del mismo para modificar o añadir
nuevos servicios es difícil. El típico ejemplo de sistema operativo con núcleo
monolítico es UNIX.
En la actualidad, se tiende hacia arquitecturas basadas en el concepto de
micronúcleo (microkernel), que consiste en un núcleo que proporciona,
básicamente, un conjunto de servicios esenciales. El resto de los servicios se
implementan como procesos servidores a nivel de usuario. Estos servidores
presentan una interfaz bien definido y son accedidos por el resto de los procesos
mediante paso de mensajes.
La filosofía de los sistemas operativos basados en micronúcleo es mantener el
núcleo lo más pequeño posible. Las ventajas de este esquema son que el sistema
operativo es muy modular y que es fácil implementar, instalar y depurar nuevos
servicios, ya que añadir o modificar un servicio no requiere parar el sistema y
arrancarlo de nuevo. Como consecuencia, estos sistemas son muy flexibles, hasta
el punto de que los usuarios que no estén satisfechos con un servicio aportado por
el sistema pueden crearse el suyo propio.
La principal ventaja de los núcleos monolíticos reside en la eficiencia, ya
que todas las funciones se llevan a cabo dentro del espacio de direcciones
del núcleo. Por el contrario, una llamada al sistema en un micronúcleo
suele consistir en el paso de un mensaje entre un proceso cliente y un
proceso servidor, que se ejecutan en espacios de direcciones diferentes (y,
posiblemente, en máquinas diferentes).
Arquitectura de un Micronúcleo
No existe una definición que establezca las funciones que debe de realizar
un todos incluyen la gestión de los recursos básicos (procesos, memoria,
entrada/salida básica e intercomunicación entre procesos).
Los micronúcleos se diseñan para ser portables entre máquinas de
arquitecturas diferentes, por lo que suelen estar codificados por lenguajes
de alto nivel, como C y C++, y están estructurados en capas, de forma que
los componentes dependientes del hardware se reducen a un mínimo nivel
inferior.
La arquitectura de un micronúcleo se muestra a continuación:
Los componentes principales son los siguientes:
* Gestor de Procesos: Gestiona todas las operaciones relativas a procesos,
como creación, eliminación y planificación. Los servicios que ofrece
suelen estar mejorados o aumentados mediante aplicaciones que se sitúan
en un nivel superior, tales como emuladores de sistemas operativos.
* Gestor de hebras: Crea, planifica y sincroniza hebras. Una hebra es una
actividad planificable que se asigna a un proceso. La política de
planificación se puede definir en un módulo a nivel de usuario.
* Gestor de comunicaciones: Permite la comunicación entre las hebras de
un procesos. En algunos casos, el núcleo incluye soporte para
comunicaciones entre hebras de procesos remotos. En otros, el núcleo no
es consciente de la presencia de otras máquinas, por lo que suele existir
un determinado servicio en un nivel superior para comunicaciones
externas.
* Gestor de memoria: Gestiona la memoria del sistema local. En algunos
casos, el espacio de direcciones virtual está repartido entre varias
máquinas, por lo que pueden existir gestores externos de memoria virtual.
* Supervisor: Es la parte que está justo por encima del hardware.
Aunque la implementación de UNIX varía de versión en versión y de
máquina a máquina, existen conceptos e ideas que son aplicables a todas.
El estudio de la implementación de UNIX es útil por dos motivos. En primer
lugar, muchas ideas empleadas en UNIX son usadas por sistemas
operativos más recientes, como OS/2 o Windows NT. En segundo lugar, el
conocimiento de la implementación permite sacar el máximo partido al
sistema operativo a la hora de programar aplicaciones
El Núcleo (Kernel) de UNIX
El kernel (núcleo) de UNIX es la parte del sistema que se carga desde disco a
memoria cuando el computador es encendido y permanece siempre en memoria
hasta que el sistema es apagado o ocurre algún error grave. Su mayor parte está
escrita en C, aunque algunos componentes del mismo están escritos en
ensamblador por motivos de eficiencia.
UNIX se basa en dos conceptos básicos:
ficheros y procesos. Por este motivo, el kernel está diseñado para facilitar
servicios relacionados con estos dos elementos (Figura abajo). Los procesos son
entidades "activas", lo que significa que realizan acciones por sí mismos,
mientras que los ficheros son meros contenedores de información que son
usados por los procesos.
El kernel es accedido por los programas de usuario mediante un interfase
conocido como llamadas al sistema, que permiten a los programas de usuario
gestionar procesos, ficheros y otros recursos. Toda llamada al sistema tiene
asignado un identificador numérico. Los procesos realizan una llamada al sistema
colocando los argumentos de la misma en registros o en la pila (stack) e
invocando una instrucción especial (trap) que pasa de modo usuario a modo
kernel. El identificador de la llamada al sistema se usa como índice para acceder a
una tabla de llamadas al sistema que existe en el kernel. Esta tabla es un array de
punteros a funciones que implementan cada llamada al sistema. Estas funciones
acceden a estructuras de datos residentes en el kernel.
Debido a que no existe una instrucción trap en C, se suministra una biblioteca de
funciones escritas en ensamblador pero que pueden ser invocadas desde
programas escritos en C.
Diagrama de bloques del kernel
El kernel tiene dos componentes principales: el subsistema de control de
ficheros y el subsistema de control de procesos. El subsistema de control
de ficheros realiza tareas relacionadas con la gestión de ficheros, como la
asignación de espacio en disco, administración del espacio libre, control
del acceso a los ficheros e intercambio de información entre ficheros y
programas de usuario. Los procesos interactúan con el subsistema de
ficheros a través de un conjunto de llamadas al sistema específicas, como
open, close, read, write, stat, chown, chmod, ... La comunicación entre el
subsistema de ficheros y los dispositivos físicos se realiza mediante los
manejadores (drivers) de dispositivo. Se distinguen dos tipos de
dispositivos según la forma en que son accedidos:
* dispositivos de bloques (block devices).
* dispositivos de caracteres (raw devices).
Procesador de comandos
El procesador de comandos, es el pequeño programa que se va a encargar
de ejecutar o lanzar los comandos o programas.
Los comandos podemos dividirlos en comando internos y comando
externos, los comando internos son aquellos que se encuentran incluidos
dentro del procesador de comandos, y al estarse ejecutando este,
entonces ya se encuentran en la memoria RAM, en consecuencia se
ejecutan mucho mas rapido. Los comando externos son aquellos
pequeños programas que necesitan ser cargados a memoria para poder
ejecutarlos, esto quiere decir que se encuentran almacenados en un
dispositivo de almacenamiento secundario o auxiliar, como pueden ser
discos duros o discos flexibles.
Un ejemplo de un procesador de comandos en MS-DOS es el
COMMAND.COM y como ejemplos de los comando internos de este
tenemos: CLS, DIR, COPY, etc., comandos externos: FDISK, FORMAT,
CHKDSK, etc.
En UNIX a los procesadores de comandos se les llama shell y dentro de
estos se encuentran: BASH, CSH, KORN, KSH, ZSH, etc., ejemplos de un
comandos internos CLEAR, CAL, DATE, etc., de externos: FSCK, FDISK,
CAT, etc.
Tipos de interrupciones
Las interrupciones por software se comportan de igual manera que las de
hardware pero en lugar de ser ejecutadas como consecuencia de una señal
física, lo hacen con una instrucción.
Hay en total 256 interrupciones, de la 0 a la 7 (excepto la 5) son generadas
directamente por el procesador. Las 8 a 0Fh son interrupciones por
hardware primitivas de las PC. Desde la AT en adelante, se incorporó un
segundo controlador de interrupciones que funciona en cascada con el
primero a través de la interrupción 2 (de ahí que en la tabla siguiente se la
denomine múltiplex). Las 8 interrupciones por hardware adicionales de las
AT se ubican a partir del vector 70h.
D H
Gen
Descripción
=============================================================
0 0
CPU
División por cero
4 4
CPU
Desbordamiento Aritmético
5 5
BIOS
Imprimir Pantalla
6 6
CPU
Código de operación inválido
7 7
CPU
Coprocesador no disponible
8 8
HARD Temporizador del sistema (18,2 ticks por seg)
9 9
HARD Teclado
En cuanto a las interrupciones por software, están divididas entre las
llamadas por el BIOS (desde la 10h a la 1Fh) y las llamadas por el DOS
(desde la 20h hasta la 3Fh). Esto es sólo la versión oficial, ya que en
realidad las interrupciones entre BIOS y DOS se extienden hasta la 7Fh.
Cómo funciona una interrupción
A partir del offset 0 del segmento 0 hay una tabla de 256 vectores de
interrupción, cada uno de 4 bytes de largo (lo que significa que la tabla
tiene una longitud de 1KB). Cada vector está compuesto por dos partes:
offset (almacenado en la dirección más baja) y segmento (almacenado en
la dirección más alta). Cuando se llama a una interrupción (no importa si es
por hardware o por software), el procesador ejecuta las siguientes
operaciones:
PUSHF (guarda las banderas en el stack)
CTF/DI (borra la bandera de Trap y deshabilita interrupciones)
CALL FAR [4 * INT#] (salta a nueva CS:IP, almacenando dirección de
retorno en stack)
La expresión 4 * INT# es la forma de calcular la dirección de inicio del
vector de interrupción a utilizar en el salto. Por ejemplo, el vector de la
INT21h estará en la dirección 84h Al efectuarse el salto, la palabra
almacenada en la dirección más baja del vector sustituye al contenido del
registro IP (que previamente fue salvado en el stack) y la palabra
almacenada en la dirección más alta sustituye al contenido del registro CS
(también salvado en el stack). Por ejemplo:
La instrucción INT 21h es la usada para efectuar llamadas a las funciones
del DOS. Supongamos que en la posición de memoria 0000:0084 está
almacenada la palabra 1A40h y en la dirección 0000:0086 está almacenada
la palabra 208Ch. La próxima instrucción que se ejecute es la que está en
la posición 20C8:1A40 (nuevo CS:IP).
El final de una rutina de interrupción debe terminarse con la instrucción
IRET, que recupera del stack los valores de CS, IP y Flags.
Notemos que un llamado a interrupción implica el cambio de estado
automático de la bandera de habilitación de interrupciones. En pocas
palabras, esto significa que al producirse una interrupción, esta bandera
inhabilita futuras interrupciones. Como la instrucción IRET restablece el
registro de flags al estado anterior que tenia antes de producirse la
interrupción, las próximas interrupciones se habilitan en el mismo
momento en que se produce el retorno desde la rutina de servicio.
Paso de parámetros desde el programa a la ISR
Cuando las interrupciones son llamadas por software mediante la
instrucción INT xx, por lo general se le deben pasar parámetros a la rutina
de servicio de interrupción (ISR). Estos parámetros definen la tarea que
debe cumplir la ISR y son pasados en los registros del procesador, lo que
es una opción muy veloz.
Un ejemplo casi extremo, en donde muchos de los registros del 8086 son
utilizados son algunos servicios cumplidos por la INT 13h (disco). Para
tomar sólo un caso, en una operación de escritura de un sector, los
parámetros se pasan de la siguiente manera:
Registro
Asignación
AH
03 (servicio de escritura de sectores)
AL
cantidad de sectores a escribir
CH
8 bits más bajos del número de cilindro
CL
(bits 0-5)número de sector
CL
(bits 6 y 7)2 bits más altos del número de cilindro
DH
número de cabeza
DL
número de unidad de disco (hard: mayor a 80h)
BX
offset del buffer de datosESsegmento del buffer de datos
Si bien no está escrito en ningún lado, las interrupciones utilizan el registro
AH para identificar el tipo de operación que deben ejecutar. Cuando una
interrupción devuelve códigos de error siempre vienen en el registro AL,
AX y/o en la bandera de Carry.
La interrupción más famosa
Sin lugar a dudas se trata de la INT 21h (funciones del DOS). El número de
función se pasa en el registro AH
Función
00h
01h
02h
03h
04h
05h
Descripción
Terminar un programa
Entrada de caracteres con salida
Salida de un carácter
Recepción de un caracter por el puerto serial
Envío de un caracter por el puerto serial
Salida por puerto paralelo
INTERRUPCIONES HARDWARE
Una interrupción se genera cuando se quiere que la CPU deje de ejecutar el
proceso en curso y ejecute una función específica de quien produce la
interrupción. Cuando se ejecuta esta función específica decimos que la
CPU está atendiendo la interrupción. Podemos realizar una clasificación de
las interrupciones, atendiendo a la fuente que las produce.
Interrupción software, se produce cuando un usuario solicita una llamada
del sistema.
Interrupciones hardware, son causadas cuando un dispositivo hardware
requiere la atención de la CPU para que se ejecute su manejador.
Excepciones, son interrupciones causadas por la propia CPU, cuando
ocurre algo no deseado, por ejemplo una división por cero.
Las interrupciones hardware son producidas por varias fuentes, por
ejemplo del teclado, cada vez que se presiona una tecla se genera una
interrupción. Otras interrupciones son originadas por el reloj, la impresora,
el puerto serie, el floppy, etcétera.
Una interrupción de tipo hardware es una señal producida por un
dispositivo físico del ordenador. Esta señal informa a la CPU que el
dispositivo requiere su atención.
La CPU parará el proceso que está ejecutando para atender la interrupción.
Cuando la interrupción termina, la CPU reanuda la ejecución en donde fue
interrumpida, pudiendo ejecutar el proceso parado originalmente o bien
otro proceso.
Existe un hardware especifico, para que los dispositivos puedan
interrumpir lo que está haciendo la CPU. La propia CPU, tiene entradas
específicas para ser interrumpida INT, cuando se activa esta entrada INT, la
CPU para lo que está haciendo y activa la salida para reconocer la
interrupción INTA, y comienza a ejecutar el código especial que maneja la
interrupción. Algunas CPU´s disponen de un conjunto especial de
registros, que solo son utilizados en el modo de ejecución de
interrupciones, lo que facilita el trabajo de tratar las interrupciones.
La placa base del computador utiliza un controlador para decodificar las
interrupciones que no son mas que señales eléctricas producidas por los
dispositivos, coloca en el bus de datos información de que dispositivo
interrumpió y activa la entrada INTde interrupción a la CPU. Este chip
controlador protege a la CPU y la aísla de los dispositivos que interrumpen,
además de proporcionar flexibilidad al diseño del sistema. El controlador
de interrupciones tiene un registro de estado para permitir o inhibir las
interrupciones en el sistema.