Limitaciones de la arquitectura IBM PC
o
La maldición de los segmentos
Artículo Original: https://theworld.com/~swmcd/steven/rants/pc.html
Por: Steven W. McDougall
Historia antigua
Altair comercializó el primer "ordenador personal" en 1975. Era un verdadero ordenador, y podía comprarse en forma de kit, por 400 dólares. La entrada se realizaba a través de interruptores de palanca en el panel frontal; la salida a través de LEDs en el panel frontal (encendido/apagado, no de 7-segmentos). Su mercado estaba formado principalmente por aficionados y piratas informáticos.
A finales de los 70, había ordenadores personales de muchos fabricantes como Tandy, Commodore, TI y Apple. Los ordenadores de distintos fabricantes no eran compatibles. Cada fabricante tenía su propia arquitectura, su propio sistema operativo, su propia interfaz de bus y su propio software. Cuando se compraba un ordenador, implícitamente se asumía un importante compromiso con los estándares de ese proveedor.
El 6502
En 1980, el Commodore 6502 ejemplificaba el estado del arte de la arquitectura. El 6502 es un microprocesador de un solo chip, con una arquitectura 8/16, es decir, un bus de datos de 8 bits y un bus de direcciones de 16 bits. El modelo de programación refleja la arquitectura del hardware: los registros que contienen valores de datos, como el acumulador, son de 8 bits, mientras que los registros que contienen direcciones, como el contador de programa, son de 16 bits. Un bus de direcciones de 16 bits produce un espacio de direcciones de 64K bytes. A principios de los 80, las DRAM de 64K estaban ampliamente disponibles, y los ordenadores basados en el 6502, como el Commodore 64 y el Apple ][, se comercializaban con un complemento completo de 64K bytes de RAM.
En 1980, IBM decidió entrar en el mercado de los PC. Se dieron cuenta -correctamente- de que la interminable caída de los precios de la DRAM pronto dejaría obsoleta la arquitectura 8/16. El siguiente paso lógico habría sido, digamos, una arquitectura 16/32, como la del Motorola 68000. Una arquitectura 16/32 habría mejorado el rendimiento duplicando el ancho de banda de la memoria y habría proporcionado un espacio de direcciones de 4G bytes, suficiente para el futuro previsible.
Lamentablemente, el 68000 no estaba disponible en 1980, como tampoco lo estaba ningún otro microprocesador de un solo chip con arquitectura 16/32. El problema es que el tamaño de la matriz aumenta directamente con la anchura de registro. Cuando se pasa de 8/16 a 16/32, todos los registros son el doble de grandes, todas las rutas de datos son el doble de anchas, la cadena de transporte del sumador de la ALU tiene el doble de términos... Todo el diseño duplica su tamaño. Y en 1980, la tecnología de procesos no había alcanzado el punto en el que se pudiera fabricar un microprocesador 16/32 de un solo chip a un precio comercializable.
El 8086
Lo que estaba disponible era el Intel 8086. El 8086 fue un intento mal concebido de proporcionar un espacio de direcciones mayor de 64K bytes sin incurrir realmente en los costes de una arquitectura mayor. El 8086 es básicamente una arquitectura 16/16. Tiene un contador de programa de 16 bits, una ALU de 16 bits, cuatro registros de propósito general de 16 bits y algunos registros de índice de 16 bits. También tiene cuatro registros de segmento de 16 bits. El 8086 realiza todos los cálculos y transferencias de datos en aritmética de 16 bits, con una excepción. Inmediatamente antes de pasar una dirección al bus de direcciones externo, el 8086 selecciona uno de los registros de segmento, lo desplaza 4 bits a la izquierda y le añade la dirección, utilizando aritmética de 20 bits. La dirección externa es por tanto de 20 bits, y el procesador tiene un espacio de direcciones de 1M de bytes.
Los cuatro registros de segmento definen cuatro segmentos:
CS | el segmento de código |
DS | el segmento de datos |
SS | el segmento de pila |
ES | el segmento extra |
La mayoría de las operaciones utilizan implícitamente el registro de segmento correcto: las búsquedas de instrucciones utilizan CS, las cargas y los almacenamientos utilizan DS, y las inserciones y extracciones utilizan SS. Unas pocas operaciones, como el movimiento de bloque, utilizan tanto DS como ES: uno para el origen y otro para el destino.
La documentación de Intel describe esta arquitectura como una comodidad de programación: aquí está tu código, aquí están tus datos, cada uno almacenado ordenadamente en su propio segmento. A los estudiantes de informática también les gustan las arquitecturas segmentadas por varias razones relacionadas con el diseño de sistemas operativos.
Sin embargo, programar esta máquina es una pesadilla. Nunca se puede abordar cualquier cosa. Primero, tienes que asegurarte de que un registro de segmento está configurado para ello, y luego tienes que construir la dirección como un offset en ese segmento. Un registro de segmento puede apuntar a cualquier lugar en todo el espacio de direcciones de 1M de bytes, pero una vez que se ha configurado, sólo proporciona acceso a un segmento de 64K. Si tienes más de 64K de código o datos, tienes que recargar los registros de segmento sobre la marcha. Un problema particular es que no hay una buena manera de indexar en un array que es mayor de 64K bytes.
IBM y los clones
En circunstancias normales, un diseño tan retorcido y defectuoso como el 8086 simplemente habría sido ignorado por el mercado y se habría desvanecido. Sin embargo, 1980 fue el año de la suerte para Intel. IBM eligió el 8086 como procesador para el PC. Respaldado por el poder de marketing y el reconocimiento del nombre de IBM, el IBM PC se hizo rápidamente con la mayor parte del mercado. Otros fabricantes abandonaron el mercado del PC (TI), se dedicaron a nichos de mercado (Commodore, Apple) o abandonaron su propia arquitectura en favor de la de IBM (Tandy). Con una cuota de mercado cercana al 90%, el PC se convirtió en un estándar de facto. Los fabricantes de software crearon sistemas operativos (MicroSoft DOS, Digital Research DOS), hojas de cálculo (Lotus 123), procesadores de texto (WordPerfect, WordStar) y compiladores (MicroSoft C, Borland C) para PC. Los proveedores de hardware fabrican unidades de disco, impresoras y sistemas de adquisición de datos que se conectan al bus externo del PC.
Aunque IBM acaparó inicialmente el mercado de los ordenadores personales, posteriormente lo perdió en favor de los vendedores de clónicos. Acostumbrada a ser un proveedor monopolístico de ordenadores centrales, IBM no estaba preparada para la feroz competencia que surgió cuando Compaq, Leading Edge, AT&T, Dell, ALR, AST, Ampro, Diversified Technologies y otros se disputaron una parte del mercado de PC. Además de precios bajos y alto rendimiento, los vendedores de clónicos aportaron otra cosa muy importante al mercado de PC: un estándar de hardware absoluto. Para vender un clon de PC, el fabricante tenía que poder garantizar que ejecutaría todo el software de PC existente del cliente y que funcionaría con todo el hardware periférico existente del cliente. La única forma de conseguirlo era diseñar el clon para que fuera idéntico al IBM PC original a nivel de registros. Así, el estándar que definió el IBM PC quedó grabado en piedra cuando docenas de proveedores de clónicos distribuyeron millones de máquinas que se ajustaban a él en todos sus detalles. Esta estandarización ha sido un factor importante en el bajo coste y la amplia disponibilidad de los sistemas PC. También ha sido un serio obstáculo en el intento de superar las limitaciones de la arquitectura del PC.
Espacio de direcciones azul
El 8086 proporciona al PC un espacio de direcciones de 1M de bytes. Esto se muestra convenientemente como dieciséis segmentos disjuntos de 64K bytes, asignados de la siguiente manera:
Segmento | Uso |
0-9 | RAM |
A-B | RAM de vídeo |
C-D | ROM en tarjetas de E/S |
E-F | ROM BIOS (código del sistema operativo) |
Con 10 segmentos permitidos para la RAM, el PC puede direccionar hasta 640K bytes de memoria principal. El espacio entre 640K y 1M se reserva para uso del hardware y del sistema operativo. A mediados de los 80, esta arquitectura se estaba quedando obsoleta. Había disponibles chips DRAM de 256K y 1M bytes; los usuarios compraban PCs con una dotación completa de 640K de RAM y querían más. Desgraciadamente, como muestra la tabla anterior, no hay sitio para poner más memoria en un PC.
Una solución fueron los sistemas de memoria de selección bancaria. Un vendedor diseñaba una tarjeta de memoria, añadía algunos registros de selección de banco y asignaba bloques seleccionados de memoria al espacio de direcciones del PC, normalmente en C0000. Con un sistema de selección de banco, el programador es el responsable de gestionar los registros de selección de banco y de realizar un seguimiento de qué banco tiene qué datos. En la actualidad, los sistemas de selección de banco suelen ajustarse a la especificación de memoria expandida de Lotus/Intel/MicroSoft (LIM-EMS). En este contexto, la palabra "ampliada" se refiere específicamente a un sistema de selección de bancos.
La memoria expandida permitió sin duda que algunos programas utilizaran más de 640K de RAM, pero es claramente inadecuada como solución a largo plazo a la necesidad de más memoria. La única solución real es pasar a una arquitectura más grande. Intel dio el primer paso introduciendo el procesador 80286.
El 80286
El 80286 es similar al 8086 en concepto. Es una arquitectura 16/24. Los buses de datos y registros son de 16 bits. El bus de direcciones externo es de 24 bits, proporcionando un espacio de direcciones de 16M bytes. Las direcciones se especifican con un selector de segmento de 16 bits y un offset de 16 bits. El selector de segmento especifica un descriptor de segmento residente en memoria. El descriptor de segmento tiene una base de segmento de 24 bits, un tamaño de segmento de 16 bits y algunos bits de atributo. Para generar una dirección, el desplazamiento de segmento de 16 bits se añade a la dirección base de segmento de 24 bits utilizando aritmética de 24 bits y, a continuación, se envía al bus de dirección externo.
El 80286 proporciona al programador un espacio de direcciones de 16M bytes. Sin embargo, todavía está limitado por la necesidad de manipular registros de segmento, y el hecho de que cada segmento está limitado a 64K bytes, como en el 8086. Más importante aún, el 80286 está limitado por la necesidad de seguir siendo compatible con PC.
Intel sabía que no podría comercializar un nuevo procesador a menos que pudiera ejecutar los programas de PC existentes. Por lo tanto, diseñaron el 80286 con dos modos de ejecución diferentes: modo real y modo protegido. El modo protegido es la arquitectura 16/24 que acabamos de describir. El modo real es una emulación exacta de la arquitectura 8086 16/16. El modo real es a veces llamado modo DOS. Cuando un 80286 se enciende, arranca en modo real. Esto le permite funcionar como el procesador de un clon de IBM PC. Utilizado de esta manera, el 80286 proporciona un aumento de rendimiento, debido a sus relojes más rápidos y buses de datos de 16 bits. Sin embargo, el programador aún está restringido a la arquitectura PC, con su espacio de direcciones de 1M de bytes y la limitación de 640K de RAM. Dado que los programas DOS y PC no se ejecutarán en un procesador 80286 en modo protegido, la mayoría de los procesadores 80286 se ejecutan en modo real.
La locura de la memoria extendida
Hoy en día, la mayoría de los PCs 80286 se entregan con varios megabytes de RAM. Dado que el 80286 tiene un espacio de direcciones de 16M bytes, esta memoria se direcciona linealmente-no es necesario hardware de selección de banco. En modo protegido, toda la memoria es utilizable. En modo real, los primeros 640K de memoria son accesibles, como en la arquitectura estándar de PC, y el resto no. La memoria que es inaccesible porque se encuentra por encima del límite de 640K de la arquitectura original del PC se denomina memoria extendida, que no debe confundirse con la memoria expandida.
El uso más común de la memoria extendida es proporcionar un disco RAM para un sistema DOS. Cuando el programa quiere acceder a los datos almacenados en el disco RAM, activa un bit de modo que cambia el 80286 a modo protegido. Esto le da acceso a la memoria extendida. El programa entonces realiza la transferencia de datos deseada entre su propio espacio de memoria y el disco RAM en la memoria extendida. Resulta que no hay forma de volver del modo protegido al modo real, por lo que el programa debe entonces guardar su estado y reiniciar el procesador. Al reiniciarse, el procesador reanuda la ejecución del programa original en modo real. En la práctica, todo esto es manejado por un controlador de dispositivo para el disco RAM, como RAMDRIVE.SYS.
Intel pretendía que el 80286 proporcionara un camino para la evolución ascendente de los sistemas de PC. En concreto, esperaban que su modo de compatibilidad con DOS le permitiera ganar aceptación y que, una vez que hubiera una base instalada suficiente de procesadores 80286, los desarrolladores de software empezaran a escribir sistemas operativos y programas que utilizaran las características del modo protegido. Lo que ocurrió en realidad fue que los vendedores de clónicos de PC lo utilizaron como un 8086 de alto rendimiento, los usuarios lo ejecutaron casi exclusivamente en modo real y los desarrolladores de software se resistieron a las complejidades y limitaciones de la arquitectura segmentada en modo protegido.
El 80386
La siguiente oferta de Intel fue el 80386. Como el 80286, el 80386 tiene una arquitectura segmentada, y como el 80286, tiene dos modos de ejecución: real y protegido.
En modo protegido, el 80386 es una arquitectura 32/32. El esquema de segmentación es aún más complejo que el del 80286, y te ahorraré los detalles. Sin embargo, permite desplazamientos de segmento de 32 bits, por lo que un único segmento puede tener hasta 4G bytes. Esto permite al programador definir un único segmento que cubra toda la memoria disponible, en lugar de tener que hacer malabarismos continuamente con una colección de segmentos de 64K bytes. También permite indexar en matrices de más de 64K bytes.
En modo real, el 80386 proporciona una emulación exacta de la arquitectura 8086 16/16.
Desafortunadamente, las capacidades del 80386 son poco más utilizadas que las del 80286. Los programas DOS y PC no se ejecutarán en un procesador 80386 en modo protegido, por lo que la mayoría de los procesadores 80386 se ejecutan en modo real. El procesador de mi máquina actual funciona en modo real. Proporciona acceso a 640K bytes de memoria principal y a un disco RAM de 3456K bytes, para un total de 4M bytes de RAM instalada.
Modelos de memoria
Nos guste o no, existen millones de PCs y tenemos que programarlos en modo real. MicroSoft C proporciona amplias facilidades para sacar lo mejor de una mala situación.
Una cuestión es si las direcciones son de 16 bits o de 32 bits. Una dirección de 16 bits proporciona un desplazamiento dentro de un único segmento. El registro del segmento ya debe estar cargado con la dirección base correspondiente. Una dirección de 32 bits proporciona tanto una dirección base de segmento como un desplazamiento dentro de ese segmento. Cuando se accede a la memoria a través de una dirección de 32 bits, el programa carga primero el registro de segmento a partir de los 16 bits superiores de la dirección y, a continuación, utiliza los 16 bits inferiores de la dirección como desplazamiento dentro de ese segmento. Las direcciones de 32 bits requieren más memoria y más ciclos de CPU, pero proporcionan acceso a todo el espacio de direcciones de 1M de bytes del procesador 8086.
Si un programa tiene menos de 64K de datos, entonces puede poner todos sus datos en un único segmento de datos y utilizar direcciones de 16 bits para acceder a él. Del mismo modo, si un programa tiene menos de 64K de código, puede poner todo su código en un único segmento de código y utilizar direcciones de 16 bits para saltos y llamadas a subrutinas. Por el contrario, si el código o los datos no caben dentro de estos límites, el programa debe utilizar direcciones de 32 bits. MicroSoft C contempla las cuatro posibilidades mediante un conjunto de modelos de memoria:
Modelo de memoria | Direcciones de datos | Direcciones de código |
Pequeña | 16 bits | 16 bits |
Pequeña | 16 bits | 16 bits |
Compacta | 32 bits | 16 bits |
Mediana | 16 bits | 32 bits |
Grande | 32 bits | 32 bits |
Enorme | 32 bits | 32 bits |
El modelo de memoria Tiny es igual que el modelo Small, salvo que el tamaño de los segmentos de código y datos juntos no debe superar los 64K bytes. Además, el modelo Tiny produce un archivo .COM en lugar de un archivo .EXE. Los archivos .COM son ligeramente más pequeños y se cargan más rápido en DOS.
El modelo de memoria Enorme es el mismo que el modelo de memoria Grande, excepto que las matrices individuales pueden superar los 64K bytes de tamaño. Sin embargo, las direcciones se siguen almacenando como pares segmento:offset, y el compilador no realiza la aritmética completa de direcciones de 32 bits en ellas. En consecuencia, las matrices de gran tamaño están sujetas a la restricción de que el tamaño del elemento de la matriz debe ser una potencia de 2.
La elección del modelo de memoria es una opción en tiempo de compilación, por lo que puede experimentar fácilmente con diferentes modelos.
_________________________________________________________________________________________________________________________
Notas
mal concebido, retorcido y defectuoso
En mi opinión
8086
En realidad, el IBM PC utilizaba el 8088, no el 8086. El 8088 es el mismo que el 8086 internamente, pero tiene un bus de datos externo de 8 bits. De este modo, el ancho de banda de la memoria se sustituye por un menor coste del sistema.
expandido
Piensa en un acordeón, con el fuelle expandiéndose por detrás del teclado.
80286
También existe un procesador 80186. Es esencialmente un 8086 con relojes, controladores de interrupción y otros circuitos de apoyo integrados en un solo chip. Se utiliza principalmente como procesador integrado en equipos de control industrial.
extendido
Piensa en una torre, con pisos adicionales que se extienden cada vez más alto.
reiniciar el procesador
No me lo estoy inventando.
___________________________________________________________________________________________________________________________
Esta obra está bajo una Licencia Creative Commons Atribución 4.0 Internacional.
Steven W. McDougall / curriculum vitae / [email protected] / febrero de 1992