Texto original creado por
Jesús Angel Sánchez Mena y Benjamín Moreno Palacios.
Versión HTML por Nacho Cabanes
La cacharrería.
Para que algunos conceptos que utilizaremos durante el curso no os suenen
a chino, vamos a dedicar este capítulo a explicar unas pocas ideas
sobre la organización y el funcionamiento de nuestro querido PC.
:)
Estructura de la memoria.
Como os daréis cuenta a lo largo de esta explicación, la
organización de la memoria en un PC no es que sea algo para elogiar.
La razón es la falta de previsión que tuvieron los primeros
desarrolladores de PCs en el año 1980, cuando dotaron a los primeros
sistemas de una memoria de 16 KB y planificaron una necesidad máxima
de 640 Kb, además, como el procesador que iba a gobernar esa arquitectura,
el 8086 y 8088 de Intel, tenía un espacio de direcciones de 1MB,
añadieron a esa memoria principal un área RAM para video,
otra para la ROM-BIOS, para cartuchos ROM, vamos, que derrochaban todo
lo que les sobraba y yo hoy me tengo que pegar para conseguir 5 Kb más
de convencional :)
Toda esta memoria se administra en base a segmentos de 64 Kb, esto es
debido a que el tipo de direccionamiento que escogieron para poder referenciar
todas las posiciones de memoria fue el direccionamiento segmentado.
Pero para ésto sí existe una explicación más
lógica.
La tecnología de aquella época tan lejana :) solo permitía
construir registros de 16 bits, (hoy en día me parece que vamos
por 64 bits). Como la cantidad de memoria que puede ser direccionada depende
directamente de la longitud de un registro, llamado registro de direcciones,
con 16 bits se puede acceder a 2 a la 16=64 Kb. Para gobernar 1 Mb se necesitaba
un registro de 20 bits, imposible para aquella época, de este modo,
se optó por utilizar dos registros de 16 bits, a uno de ellos (registro
de segmento) lo desplazamos cuatro posiciones a la izquierda (o se multiplica
por 16) y le sumamos el otro registro (registro de desplazamiento) tal
y como está, consiguiendo así nuestra dirección de
20 posiciones.
Como veis este tipo de direccionamiento es un poco lioso, y mucho más
si lo comparamos con el direccionamiento lineal, donde se trata a la memoria
como una 'línea' de direcciones todas consecutivas. Esta técnica
se utiliza en otras arquitecturas, como la basada en los procesadores de
la familia del 68000 de Motorola, (yo he trabajado con estos procesadores
y creedme no hay ni punto de comparación en ese aspecto y en muchos
otros), esos procesadores son los que se utilizan para programar los videojuegos
de verdad, (sí, sí, los de las máquinas recreativas)
y no me extraña nada. :)
Si tan mala es esa organización de la memoria, por qué
seguimos utilizándola, si hoy en día disponemos de microprocesadores
que direccionan hasta 4 Gb y registros de 64 bits, pues echarle la culpa
a esas 4000 líneas de código que en su día fue el
MS-DOS 1.0, el por qué del auge que tuvo este sistema operativo
es un tema que supongo todos conoceréis, por lo que no voy a seguir
con la clase de historia..... :)
Os muestro, para terminar con el apartado de la memoria, la organización
en bloques de 64 Kb de la memoria del PC:
Función
Dirección Bloques
de 64 KB -------
--------- ---------------- Memoria principal
0000:0000 - 9000:FFFF 10 RAM video (EGA/VGA)
A000:0000 - A000:FFFF
1 RAM de video
B000:0000 - B000:FFFF
1 BIOS-ROM adic.
C000:0000 - C000:FFFF
1 Cartuchos-ROM
D000:0000 - D000:FFFF
1 Cartuchos-ROM
E000:0000 - E000:FFFF
1 BIOS-ROM
F000:0000 - F000:FFFF
1
Registros.
Uno de los componentes más importantes de un procesador son los
registros. En ellos podemos cargar datos de la memoria de 16 y 8 bits,
operar con ellos y luego devolverlos a la RAM; ésto lo realizaremos
siempre que podamos, ya que trabajar con los registros es mucho más
rápido que trabajar con la memoria directamente, debido a que no
se necesita acceder a los buses del ordenador. Cuando he dicho 16 y 8 bits,
me gustaría recordaros que aunque el tamaño de los registros
a partir del 386 es de un mínimo de 32 bits, no se puede acceder
a la totalidad de los mismos debido a que en DOS trabajamos en modo el
Real. Pufff :)
Existen cuatro tipos de registro
según su función:
Generales. AX, BX, CX y DX con ellos hacemos las operaciones lógicas
y aritméticas y también los utilizamos para pasar parámetros
a las funciones de la BIOS y el DOS. Pueden ser referenciados totalmente
(AX) o seleccionar su parte alta (AH) o parte baja (AL) para trabajar con
8 bits.
Bandera. Se utiliza para que las instrucciones que se ejecutan consecutivamente
conozcan las consecuencias o eventos producidos por instrucciones anteriores.
Podemos conocer entre otras cosas si ha habido desbordamiento, acarreo,
último resultado cero, último resultado negativo... Este
registro a diferencia del resto casi no lo utilizaremos.
Segmento CS, DS, SS, ES
Dirección IP, SI, SP, DI, BP
Estos dos últimos tipos se utilizan conjuntamente para formar
la dirección de 20 bits que nombramos antes. Se suelen asociar según
el orden con que fueron enumerados.
Cada registro de segmento tiene un objetivo diferente:
CS Segmento de código, guarda las instrucciones del programa.
DS Segmento de datos, almacena los datos del programa.
SS Segmento de pila, se utiliza, entre otras cosas, para guardar los parámetros
pasados y la información de retorno después de un salto.
ES Segmento extra, se suele utilizar conjuntamente con el DS para trasferencias
rápidas de información.
Puertos.
Se usan para la comunicación entre los programas y el hardware.Existen
puertos de entrada y/o salida y cada uno tiene una dirección entre
0 y 65535. Las direcciones que referencian a cada puerto no son impuestas
por el sistema, sino que dependen de las propias tarjetas y aunque existe
una organización estándar, la mayoría de los fabricantes
permite modificar los puertos de sus tarjetas por si surgen problemas.
El comunicarse con los puertos es semejante a trabajar con la memoria.
Para utilizarlos se hará uso de las instrucciones máquina
in y out. Los puertos para nosotros serán el más bajo nivel
en el que trabajaremos, ya que leer o escribir datos en un puerto es 'hablar'
directamente con la máquina sin necesidad de 'traductores' como
la BIOS, pero ¡Ojo! hay que tener cuidado porque pueden saltar chispas.
:)
Interrupciones.
Las interrupciones son una manera de llamar la atención de la CPU
cuando se necesita su acción, si no existiesen, ésta gastaría
su precioso tiempo en preguntar a todos los dispositivos si quieren sus
servicios ( método llamado polling). Su función es controlar
el hardware y servir de contacto entre los programas y las funciones de
la BIOS y el DOS.
Existen dos tipos de interrupciones, software y hardware:
Software Se utilizan para llamar a unos programas que el ordenador,
su sistema operativo o cualquier driver pone a función de los usuarios.Tienen
que ser vistas como llamadas a subrutinas, pero con las salvedad de que
éstas son del sistema y no nuestras (lo pueden ser), diferenciando
que para llamar a estar interrupciones hay que hacer uso de instrucciones
especiales.
Hardware Son producidas por los componentes HW y gestionadas por
el controlador de interrupciones PIC (8259), a esta 'cucaracha' se pueden
conectar hasta 8 dispositivos diferentes en el caso de los XT y hasta 15
en el caso de los AT, según la línea a la que esté
conectado el dispositivo, tendrá más o menos prioridad, además
el PIC permite su programación para habilitar y deshabilitar algunas
de estas líneas, función que utilizaremos en las últimas
lecciones (apartado de comunicaciones). Estas interrupciones hardware son
las famosas IRQs por las que se pelean nuestros dispositivos, en especial
nuestro ratón y nuestro módem. Aunque su llamada se produce
de diferente manera a las interrupciones software, su funcionamiento es
más o menos similar y se basa en la utilización de la tabla
de interrupciones que describiremos a continuación.
Tabla de interrupciones.
Es una estructura que se crea durante la puesta en marcha del ordenador
y se sitúa en la parte más baja de la memoria, segmento 0
y desplazamiento 0, tiene 256 entradas de 4 bytes cada una, en total 1
kb de longitud. Su funcionamiento es el siguiente, cuando nosotros hacemos
uso de una función de la BIOS o DOS, utilizamos una rutina que se
encuentra en algún lugar de la ROM-BIOS, pero no sabemos su dirección,
únicamente conocemos su número de interrupción. Este
se utilizará como índice en dicha tabla, para que el sistema
recupere la verdadera dirección del servicio requerido. Las interrupciones
hardware también tienen asignada una entrada en esta tabla donde
estará la dirección de la rutina que las atiende.
Por lo tanto, quede claro que cada entrada de 4 bytes en la tabla es
una dirección, formada por 2 bytes del segmento y 2 del desplazamiento.
Este indireccionamiento permite a los fabricantes de PC , usar sus propias
rutinas ROM-BIOS, teniendo únicamente que poner la dirección
de éstas, en la correspondiente posición de la tabla . Las
nuevas rutinas, tendrán que tener los mismos parámetros y
devolver los mismos valores que las funciones originales, así los
usuarios y aplicaciones no distinguirán, unas rutinas de otras.
Pero lo que a nosotros nos interesa es que también podemos sustituir
esas direcciones, por la ídem de una rutina que hayamos creado nosotros,
controlando así distintos sucesos como a nosotros nos interese.
:)
Bueno con la somera explicación del funcionamiento de la tabla
de interrupciones doy por terminado este artículo sobre el hardware
del PC. Para que veáis como funcionan todas estas herramientas en
un lenguaje determinado, (PASCAL) y con un objetivo determinado, (control
del teclado) consultar el artículo sobre el teclado donde se utilizan
todos estos recursos de la máquina y se dan más detalles
'sobre la marcha'. :)