2.4.1 Servicios BIOS
§1 Sinopsis
La tabla de vectores de interrupción IDT ("Interrupt Description Table") del PC es una zona de 1024 bytes en la memoria baja, que contiene un máximo de 256 vectores (punteros) a los programas que atienden las interrupciones ISR's ("Interrupt service routine"). Estos punteros son de 4 bytes y están en forma segmentada ( 5.1); los dos primeros bytes indican el desplazamiento y los dos siguientes el segmento.
Cuando el procesador necesita encontrar alguna ISR, el dato de inicio es su número de servicio (también conocido como número de interrupción); a partir de este dato, multiplicando por 4 se obtiene la dirección absoluta del puntero (la IDT comienza en la dirección 0).
Por ejemplo: Cuando se pulsa una tecla, se genera una interrupción hardware ( 2.4) con el número 9; su dirección es 9 x 4 = 36d = 24h, que en forma segmentada sería 0000:0024.
Nota: Para obtener el contenido de esta dirección (que es la dirección de inicio del ISR del teclado) puede utilizarse el programa DEBUG ( 1.7.1w2). La forma es la siguiente:
- Invocar DEBUG desde una ventana DOS (suponemos que estamos en Windows; el "prompt" es un guión "-")
-
introducir el comando
D 0000:0024 L 4
(pedimos que nos muestre 4 bytes a partir de la dirección indicada). -
Salir de Debug con
Q
En mi PCm la respuesta al comando es:
0000:0020 D2 08 DB 0A
El grupo a la derecha indica el contenido hexadecimal de los 4 bytes solicitados, en el orden creciente de posiciones de memoria. Son por tanto, los contenidos de las posiciones 0000:0024; 0000:0025; 0000:0026 y 0000:0027. Teniendo en cuenta lo señalado respecto al almacenamiento (back-word 5), en mi PC, la dirección segmentada de la rutina de manejo del teclado es 0ADB:08D2. Como puede verse, está en el segmento 0ADB, correspondiente a la zona baja de la memoria de usuario.
Nota: El valor 0000:0020
a la
izquierda del resultado podría conducir a error, dado que la dirección solicitada no es esta. La justificación es que
el inicio de cada línea no puede ser una dirección cualquiera, sino un múltiplo de 16 (Fh). En nuestro caso 0024h (36d)
no es divisible por 16. debug comienza la línea en la posición señalada, pero elimina las
posiciones anteriores, dejando solo las que hemos pedido. Para ver el párrafo completo, puede hacerse:
-D 0000:0020 L F
Aquí le hemos pedido que que muestre 16 bytes (Fh) a partir de la dirección indicada, y se obtiene el párrafo que sigue (hemos resaltado los resultados del caso anterior):
0000:0020 00 00 00 D2 08 DB 0A 0C-3A 00 BE 09 52 00 BE
§2 Servicios BIOS
Durante la secuencia de arranque del sistema, el programa de inicio se ocupa de iniciar algunos de estos punteros, que corresponden con programas (aquí se llaman "servicios"), que están en la propia BIOS [1]; son los denominados servicios BIOS, a los que dedicamos el presente epígrafe.
§3 Servicios del sistema
Además de los anteriores, en la IDT se situan otra serie de vectores que apuntan a rutinas del propio Sistema Operativo. Estos vectores son situados en el proceso de carga del Sistema, y apuntan siempre a zonas de memoria RAM.
§4 Resumen de servicios del BIOS
Los servicios proporcionados por el BIOS pueden agruparse en cuatro grandes grupos:
- Servicios a periféricos (incluyen video, disquete, teclado, puertos de comunicaciones, impresora y pantalla).
- Servicios de estado del equipo (incluyen conocer los dispositivos presentes, incluyendo el tamaño de la memoria disponible).
- Servicio de hora (posibilidad de leer y escribir el número de "ticks de reloj pasados desde media noche)
- Servicios adicionales (permiten activar el BASIC y reiniciar el sistema)
Estos servicios son atendidos por doce vectores que se detallan un poco más ampliamente en el siguiente epígrafe, pero es importante conocer que el BIOS proporciona varios subservicios dentro de cada interrupción (por ejemplo, la 16, de video, incluye 19 subservicios, cada uno de los cuales tiene una funcionalidad específica). La invocación de estas rutinas debe hacerse en lenguaje ensamblador, y los diferentes subservicios son invocados mediante la colocación de determinados valores en ciertos registros del procesador [2]. En cierto sentido este método es equivalente a la invocación de una función a la que se pasan distintos parámetros en función del comportamiento (respuesta) que deseamos obtener.
§5 Detalle de servicios del BIOS
La tabla de vectores de interrupción del PC tiene posiciones que son estándar, esto significa que algunos números de interrupción corresponden a un mismo servicio en todas las máquinas. En la tabla adjunta se han señalado aquellos servicios que corresponden a la BIOS, indicando el número de interrupción (decimal), la dirección absoluta del vector (en hexadecimal) y el uso de la ISR correspondiente.
Numero |
Dirección |
Uso |
5 |
0014h |
Servicio de impresión del contenido de la pantalla. La invocación de este servicio provoca el mismo resultado que la combinación de teclas SHIFT+CTRL (que utilizan este servicio). |
8 | 0020h | El reloj del sistema genera interrupciones con este número con una frecuencia de 18.21 veces por segundo aproximadamente (se conocen como "ticks") [3]. Este servicio incrementa en una unidad la cuenta del reloj (almacenada en la memoria de datos de la ROM-BIOS 0.3.3). Del valor de este contador, que es puesto a cero cada 24 horas, se basan los servicios de hora del sistema (servicio 26 ). |
16 |
0040h |
Servicios de video. Contiene 16 subservicios tales como ajuste del tamaño y desplazamiento del cursor, escritura y lectura de un carácter o de un píxel, desplazamiento vertical ("Scroll"), ajuste y lectura del modo de video, etc. |
17 |
0044h |
Servicio de componentes del equipo. Proporciona una palabra de 16 bits que contiene información básica sobre los componentes instalados en el ordenador. |
18 |
0048h |
Este servicio informa del tamaño de la memoria instalada en el sistema. |
19 |
004Ch |
La ROM BIOS proporciona seis servicios estándar de disquete: Reinicialización; obtención del estado; lectura; escritura y verificación de sectores, y formateo de pistas. A partir de la introducción del IBM PC AT, se introdujeron 12 nuevos servicios para disco, incluyendo recalibrado de la unidad, diagnóstico del controlador, etc. |
20 | 0050h | En esta interrupción se agrupan diversos subservicios de comunicaciones para puertos serie proporcionados por la BIOS: Inicializar los parámetros de inicio del puerto; enviar un carácter; recibir un carácter; obtener el estado del puerto. |
21 | 0054h | Incluye los servicios de cassette. En realidad es una reliquia prehistórica, ya que el PC tenía posibilidad de una cassette opcional. |
22 | 0058h | Incluye los servicios de teclado que incluye tres subservicios: Lectura de un carácter del buffer del teclado; Informar si hay algún carácter en el buffer; selección mayúsculas/minúsculas (estado del "Shift"). |
23 | 005Ch | Incluye tres subservicios para impresora: Enviar un carácter al puerto paralelo; Inicializar el puerto; obtener un informe esquemático del estado de la impresora. |
24 | 0060h | Esta es otra reliquia prehistórica. Se trata del cargador del intérprete BASIC; este lenguaje que estaba presente en la ROM de los primeros PC's. |
25 | 0064h | Este servicio es la rutina de puesta en marcha ("bootstrap") del equipo. El resultado de su activación es equivalente a su puesta en marcha. Se denomina reinicio en caliente, y es parecido al efecto que se consigue por el teclado con la combinación CTRL+ALT+DEL. |
26 | 0068h | Este servicio
suministra la hora del sistema mediante la inspección del contador de
ticks de reloj pasados desde media noche (ver servicio 8 ).
Incluye dos subservicios, que permiten respectivamente leer y escribir
el valor del contador de ticks.
Nota: La librería estándar C++ dispone de una función clock() que devuelve el valor del tiempo transcurrido desde el inicio del programa. Esta función se basa en la inspección del contador de ticks. |
[1] El proceso de carga puede copiar estos programas en en otros puntos de la memoria RAM (lo que ocurre si se utiliza una shadow-BIOS por ejemplo, H4).
[2] La mejor referencia al respecto que conozco es: Peter Norton "The Peter Norton Programer's Guide to the IBM PC" 1985 Microsoft Press.
[3] El valor resulta de dividir la la frecuencia 4.772720 MHz del reloj del IBM PC original ( 2) por 218. El resultado: 4.77272 · 106 / 262144 = 18.206.