Dispositivos
de E/S
Los dispositivos de E/S constan generalmente
de dos partes: un controlador de dispositivo y el dispositivo en sí. El controlador
del dispositivo es un chip o un conjunto de chips montados en una tarjeta
insertable (denominada tarjeta controladora) que controla físicamente el
dispositivo. Dicho controlador acepta comandos del sistema operativo, como por
ejemplo leer datos del dispositivo, y los ejecuta.
El otro componente es
el dispositivo en sí. Los
dispositivos tienen interfaces relativamente simples, debido a que no hacen
cosas complicadas y para poder estandarizarse. Lo último es necesario para que
cualquier controladora de disco IDE pueda controlar cualquier disco IDE, por
ejemplo. IDE son las siglas en inglés de Integrated Drive Electronics
(electrónica integrada en la unidad) y es el tipo de disco estándar en el
Pentium y en algunos otros ordenadores. Puesto que la interfaz real con el
dispositivo está oculta tras el controlador, lo único que ve el sistema
operativo es la interfaz con el controlador, que podría ser muy diferente de la
interfaz con el dispositivo.
Puesto que cada tipo
de controlador es distinto, se necesita diferente software para controlar cada
uno. El software que se comunica con un controlador, enviándole comandos y aceptando
sus respuestas, se denomina controlador (software) del dispositivo o
driver del dispositivo. Para evitar confusiones entre el
controlador (software) y el controlador (hardware) del dispositivo, nos
referiremos en lo sucesivo al controlador (software) del dispositivo como el driver
del dispositivo. En otros libros se evita esa ambigüedad simplemente
refiriéndose (en femenino) al controlador (hardware) como la (tarjeta)
controladora del dispositivo. Los fabricantes de controladores de dispositivos
tienen que proporcionar los drivers del dispositivo para cada sistema operativo
que lo soporte. De esta manera un escáner podría venir con drivers para Windows
98, Windows 2000 y UNIX, por ejemplo.
Antes
de poder utilizar el dispositivo, es necesario incluir su driver en el sistema operativo
para que pueda ejecutarse en modo núcleo. Teóricamente los drivers
también podrían ejecutarse fuera del núcleo, pero pocos sistemas operativos
actuales soportan esta posibilidad debido a que requiere la capacidad para
permitir que un driver en el espacio de usuario pueda tener acceso al
dispositivo de forma controlada, característica raramente soportada. Hay tres maneras
de situar el driver dentro del núcleo. La
primera consiste en volver a enlazar
el núcleo con el nuevo driver y luego reiniciar el sistema. Muchos sistemas
UNIX funcionan así. La segunda manera
consiste en incluir una entrada en un fichero del sistema operativo para indicarle
a éste que necesita el driver del dispositivo, y luego reiniciar el sistema. En
el momento del arranque, el sistema operativo procede a buscar los drivers que
necesita y los carga. Windows funciona así. La tercera manera es que el sistema operativo pueda aceptar nuevos
drivers mientras se está ejecutando y los instale sobre la marcha sin tener que
reiniciar el ordenador. Esta manera de integrar el driver se desarrolló para
situaciones raras pero actualmente se ha convertido en algo habitual.
Todo controlador
cuenta con un pequeño número de registros que sirven para comunicarse con él.
Por ejemplo, un controlador de disco en su versión más sencilla podría tener
registros para especificar la dirección en disco, la dirección en memoria, el
número de sectores y el sentido de la transferencia (lectura o escritura). Para
activar el controlador, el driver recibe un comando del sistema operativo y lo
traduce a los valores apropiados que debe escribir en los registros del
dispositivo.
En algunos
ordenadores, los registros del dispositivo están mapeados en el espacio de direcciones
del sistema operativo, de modo que pueden leerse y escribirse como si fueran palabras
de memoria ordinarias. En tales ordenadores no se necesitan instrucciones de
E/S especiales y es posible proteger el hardware del acceso indiscriminado por
parte de los programas de usuario simplemente colocando fuera de su alcance
esas direcciones de memoria (por ejemplo, utilizando registros de base y de
límite). En otros ordenadores, los registros de dispositivo se colocan en un
espacio de puertos de E/S especial, con cada registro teniendo una dirección de
puerto. En estas máquinas se dispone en modo núcleo de instrucciones especiales IN y OUT que permiten
a los drivers leer y escribir en los registros. El primer esquema elimina la
necesidad de instrucciones de E/S especiales pero mantiene permanentemente
ocupada alguna parte del espacio de direcciones. El segundo esquema no ocupa el
espacio de direcciones para nada pero requiere instrucciones especiales en el
repertorio de instrucciones del lenguaje máquina.
Las operaciones de
entrada y salida pueden realizarse de maneras distintas. En el método más sencillo, un programa de
usuario realiza una llamada al sistema, que el núcleo traduce en una llamada a
un procedimiento del driver apropiado. El driver pone en marcha 28 entonces la
E/S y entra en un bucle de espera que consulta continuamente el dispositivo
para ver si ya terminó (es usual que haya un bit que indique si el dispositivo
sigue ocupado o no). Una vez terminada la E/S, el driver coloca los datos (si
los hay) donde se necesitan y retorna. El sistema operativo devuelve entonces
el control al programa que lo invocó a través de la llamada al sistema. Este
método se denomina espera activa (busy waiting o polling)
y tiene la desventaja de mantener ocupada a la CPU consultado el estado del
dispositivo hasta que termina la E/S.
El
segundo método consiste en que el driver pone en marcha el
dispositivo y lo programa para que genere una interrupción cuando haya
terminado. En ese momento el driver retorna devolviendo el control al sistema
operativo. Entonces el sistema operativo si es necesario bloquea al programa
que hizo la llamada al sistema y busca otras cosas útiles que hacer. Cuando el
controlador (hardware) del dispositivo detecta el final de la transferencia, genera
una interrupción para avisar de su terminación. Las interrupciones son
muy importantes en los sistemas operativos, por lo que vamos a examinar la idea
con más detenimiento.
No hay comentarios:
Publicar un comentario