¿Cómo se programaron los primeros microprocesadores?

44

Esto acaba de darme cuenta de que si estás escribiendo un sistema operativo, ¿en qué lo estás escribiendo? Pregunto esto mientras estoy leyendo un libro de microprocesadores de 1980 y esta pregunta me vino a la cabeza:

¿Cómo se programó el primer chip microprocesador?

La respuesta puede ser obvia pero me está molestando.

Decano
fuente
66
Si se me permite conectar mi propio trabajo, vea mi respuesta a "¿Cómo puede compilarse el kernel de Linux?" en desbordamiento de pila . La respuesta no es obvia hasta que comprenda el principio general, en cuyo punto dirá "Bueno, por supuesto ..."
dmckee
@dmckee Pero aún no responde la pregunta ¿cómo sabía qué hacer :) quién le dijo a la computadora con los interruptores qué hacer? Quiero un poco más de detalle.
Dean
44
Entonces, ¿la pregunta es sobre el diseño de la secuencia de arranque del primer chip? Bueno, esa es ciertamente una pregunta que pertenece a este sitio, pero procede como diseñar una lógica digital construida a partir de componentes ... hacer que comience en un estado conocido, luego alimentar las entradas que harán cosas útiles. Lo dejo a otra para proporcionar la respuesta detallada, porque estoy muy al día en eso, sino que no sé que los primeros ordenadores se llevaron a cabo en tubos de vacío, ¿verdad? Luego hubo una generación en transistores individuales, todo antes del primer micro chip. Los ingenieros ya sabían lo que estaban haciendo.
dmckee
1
En procesadores no micro, por supuesto.
user253751

Respuestas:

56

Tomaré tu pregunta literalmente y hablaré sobre todo de microprocesadores, no de computadoras en general.

Todas las computadoras tienen algún tipo de código de máquina. Una instrucción consta de un código de operación y uno o más operandos. Por ejemplo, la instrucción ADD para el Intel 4004 (el primer microprocesador) se codificó como 1000RRRR donde 1000 es el código de operación para ADD y RRRR representaba un número de registro.

Los primeros programas de computadora se escribieron a mano, codificando a mano los 1 y 0 para crear un programa en lenguaje de máquina. Esto luego se programa en el chip. Los primeros microprocesadores utilizaron ROM (memoria de solo lectura); luego fue reemplazado por EPROM (ROM programable borrable, que se borró con luz UV); ahora los programas generalmente se programan en EEPROM ( "Electrically ...- EPROM" , que se puede borrar en el chip), o específicamente en la memoria Flash.

La mayoría de los microprocesadores ahora pueden ejecutar programas sin RAM (esto es más o menos estándar para todo menos los microcontroladores), pero en primer lugar tiene que haber una forma de cargar el programa en la RAM. Como Joby Taffey señaló en su respuesta, esto se hizo con interruptores para el Altair 8080, que funcionaba con un Intel 8080 (que seguía al 4004 y al 8008). En su PC, hay un poco de ROM llamada BIOS que se utiliza para iniciar la computadora y cargar el sistema operativo en la RAM.

El lenguaje de máquina se vuelve tedioso muy rápido, por lo que se desarrollaron programas de ensamblador que toman un lenguaje de ensamblador mnemónico y lo traducen, generalmente una línea de código de ensamblaje por instrucción, en código de máquina. Entonces, en lugar de 10000001, uno escribiría ADD R1.

Pero el primer ensamblador tuvo que escribirse en código máquina. Entonces podría reescribirse en su propio código de ensamblador, y la versión en lenguaje de máquina solía ensamblarlo la primera vez. Después de eso, el programa podría ensamblarse. Esto se llama bootstrapping y también se realiza con compiladores: generalmente se escriben primero en ensamblador (u otro lenguaje de alto nivel), y luego se reescriben en su propio idioma y se compilan con el compilador original hasta que el compilador pueda compilarse.

Dado que el primer microprocesador se desarrolló mucho después de que existieran los mainframes y las minicomputadoras, y el 4004 no era realmente adecuado para ejecutar un ensamblador de todos modos, Intel probablemente escribió un ensamblador cruzado que se ejecutó en una de sus computadoras grandes, y tradujo el código de ensamblaje para el 4004 en una imagen binaria que podría programarse en la ROM. Una vez más, esta es una técnica común utilizada para portar compiladores a una nueva plataforma (llamada compilación cruzada ).

tcrosley
fuente
Gran respuesta tcrosley! Se corrigió un tidbit sobre EEPROM vs EPROM. +1
tyblu
1
Y si realmente quisiera programar un microcontrolador sin otra computadora (además de su cerebro), podría hacerlo mediante la creación de circuitos que alimentaran el programa directamente. Si se programó sobre jtag, entonces podría accionar los interruptores para imitar los comandos jtag necesarios para programar el dispositivo. Si usara ram externo, entonces podría usar muchos demultiplexores y enormes conjuntos de resistencias atadas alta o baja para representar los bits de las instrucciones (y probablemente usar una velocidad de reloj baja porque su hardware será lento).
nategoose
3
@tyblu: estoy bastante seguro de que las FROM-PROM precedieron a las EPROM. La forma más simple de ROM es esencialmente una matriz de diodos poblada selectivamente (en los primeros días, los diodos se soldarían literalmente en una cuadrícula para representar una polaridad de bit; un diodo faltante representaba la otra polaridad). Un fusible-PROM coloca una matriz de diodos en un chip, pero tiene transistores de fila que son mucho más resistentes que los diodos en las intersecciones. Uno podría eliminar los diodos de manera selectiva configurando los cables de dirección y luego golpeando con fuerza los cables de datos conectados a los diodos que uno deseaba eliminar.
supercat
@tyblu: Tenga en cuenta que las PROM de fusibles no son eléctricamente nada como las OTPROM modernas, que son simplemente chips EPROM en paquetes sin ventanas. Los dispositivos EPROM / OTP se programan cargando eléctricamente las puertas de ciertos transistores (que tienen suficiente capacitancia y poca fuga suficiente para mantener una carga esencialmente indefinidamente). Por el contrario, los chips fusibles-PROM se programan destruyendo físicamente las conexiones a los diodos no deseados.
supercat
1
echa un vistazo a esta 'ROM' de los días de los transistores discretos: en.wikipedia.org/wiki/Core_rope_memory
JustJeff
23

Originalmente, los programas se escribían en papel y luego se transponían a cualquier método de entrada que la computadora tuviera disponible. Esto pasó de perillas, interruptores y cables de puente en las primeras computadoras, tarjetas perforadas, teclados / tableros.

La siguiente ilustración muestra lo que usan los programadores reales actuales :

W5VO
fuente
10
Maldición, emacs ..
tyblu
66
Yo programo programadores. (Y esos programadores que programo programadores que programan programadores)
Mateen Ulhaq
44
Hago mis propios programadores.
W5VO
16

Bueno, estaba cerca cuando salieron los micros por primera vez, escribimos ensambladores y compiladores cruzados en mainframes y minis, luego los pusimos en un hardware de 8 bits, la gente realmente no se molestó en construir compiladores / ensambladores en micros hasta que tuvieron suficiente almacenamiento local para hazlo útil

Pablo
fuente
14

Una forma temprana de memoria de solo lectura era una cuadrícula donde la dirección seleccionaría una fila (bajando), y las columnas representaban datos. Cada columna tendría un pull-up, y cada intersección tendría un diodo soldado para representar un "cero", o ningún diodo para representar un "uno" [los niveles de bits podrían invertirse si se desea, en casos donde eso reduciría el cantidad de diodos requeridos]. Cualquier patrón deseado de bits podría "programarse" soldando en los diodos adecuados.

Este diseño se introdujo en el mundo de los circuitos integrados en forma de fusible-PROM. Esencialmente, un PROM con fusible era un circuito como el anterior, construido en un chip, excepto que todos los diodos estaban poblados, y cada diodo tenía un fusible débil en serie con él. Tal como se envió, una PROM leería "0" en todas las ubicaciones. Sin embargo, uno podría eliminar de forma selectiva los diodos seleccionando la dirección apropiada y elevando las líneas de datos apropiadas a "alto" [nota: creo que cada bit puede haber tenido su propio transistor, en lugar de un diodo, pero el principio es el mismo].

Las PROM programadas con fusibles fueron reemplazadas por memorias de semiconductores, que almacenan bits mediante la implantación de cargas en condensadores internos. Estos recuerdos no solo son más compactos que los fusibles-PROM, sino que si están alojados en paquetes transparentes a los rayos UV, pueden borrarse y reutilizarse. Tenga en cuenta que incluso las llamadas memorias "programables de una sola vez" casi siempre usan este mismo diseño, pero simplemente se encuentran en paquetes opacos a los rayos UV.

dos hombres apuntando a una gran matriz de diodos tienda de control de matriz de diodos de la computadora Whirlwind de 1950 MIT

matriz de transistores con pequeños transistores SMD tienda de control de matriz de transistores de 2005 la CPU MT15

Super gato
fuente
Espero que no te importe el pequeño ajuste que hice a tu publicación.
davidcary
7

No estoy seguro de que alguien haya abordado la verdadera pregunta del OP, que parece ser "¿Cómo sabe la computadora cómo comenzar?" , así que voy a echarle un vistazo.

Comience con una analogía. "¿Cómo sabe un transistor cómo comenzar?" Por supuesto, no lo hace, solo funciona de acuerdo con la física, y el ingeniero construye el circuito para que comience en un estado conocido.

Las computadoras saben cómo comenzar porque son circuitos (muy complicados, por supuesto) y están diseñados para iniciarse en un estado particular. En una máquina moderna, ese estado podría ser uno en el que el bus principal reasigna parte del espacio de direcciones para usar una ROM en la placa base como poca memoria (la ROM se ha quemado con un BIOS). En una máquina de primera generación, el estado inicial podría haberse detenido por la CPU, el contador del programa en cero y el subsistema de alternancia de memoria activo.

dmckee
fuente
6

Un sistema operativo es un programa de computadora que se ejecuta directamente en el procesador. Se puede escribir en cualquier idioma que se pueda compilar o ensamblar según las instrucciones de la máquina. Asamblea y C son opciones comunes.

El código se carga en los procesadores una sola instrucción a la vez desde una tienda: una ROM o RAM.

El Z3 , el primer procesador programable fue construido con relés electromecánicos y leyó las instrucciones de la película perforada.

El Altair 8800, la primera computadora personal, se programó mediante interruptores de palanca.

Para saber cómo se construye un procesador a partir de la lógica digital, consulte https://electronics.stackexchange.com/questions/5516/a-fun-book-to-learn-computer-architecture-for-not-exactly-beginners

Para ver un historial, consulte http://en.wikipedia.org/wiki/History_of_computing_hardware

Toby Jaffey
fuente
5

Aquí hay un poco sobre computadoras realmente viejas:

Hasta donde yo sé, en aquellos días, tenías un gran panel frontal de computadora que se usaba para programarlos. Básicamente, cada celda de memoria en esas computadoras estaba conectada a conmutadores. Encendería la memoria y luego usaría interruptores para configurar los datos en cada celda. De esta manera, ingresaría el programa poco a poco en la memoria de la computadora. Luego establecería el punto de inicio del programa y comenzaría la ejecución.

A medida que la tecnología progresaba, se desarrollaron los llamados programas de cargador de arranque. Son programas cortos cuyo objetivo es iniciar otro programa desde la memoria de la computadora. El problema al ingresar programas poco a poco (y luego más de un bit utilizando números hexadecimales octales y posteriores) fue que era muy lento y había una gran posibilidad de que el operador cometiera un error al cargar el programa. Por lo tanto, los programas cortos se usarían para cargar programas más grandes almacenados en la memoria de la computadora. A medida que pasaba el tiempo, la parte del código que debía ingresarse a mano disminuía y en las computadoras modernas a menudo tenemos cargadores de arranque escritos en algún tipo de ROM o incluso memoria flash.

AndrejaKo
fuente
44
En las máquinas de 'panel frontal', como los sistemas S-100 anteriores, los interruptores le permiten tomar el control del bus del sistema. Un interruptor le permitiría suspender el procesador. Mientras el procesador estaba suspendido, podría colocar manualmente una dirección en el bus de direcciones (a través de conmutadores), colocar datos en el bus de datos (más conmutadores) y luego provocar manualmente un ciclo de escritura en el bus (otro conmutador), o un ciclo de lectura para recuperar los datos de 8 LED individuales y leer el binario, etc. Al hacer esto, podría almacenar suficiente código de máquina en la RAM, suspender el procesador e ir desde allí.
JustJeff
4

Hace unos años me encontré con un programador de microcontroladores que tenía una pantalla de cuatro dígitos y siete segmentos y un teclado hexadecimal. Estoy seguro de que esto no tenía un microcontrolador a bordo y le permitió ingresar el código de la máquina directamente un byte a la vez.

Por lo tanto, esto le permitiría compilar (dolorosamente) una lista de códigos operativos manualmente uno por uno e ingresarlos en el chip.

No tengo idea si todavía puede obtenerlos, pero supongo que algo similar se usó cuando los microcontroladores eran relativamente nuevos.

BG100
fuente
1
Suena como posiblemente el KIM-1 o Cosmac ELF, que incluían un microprocesador (MOS 6502 y RCA [CD] 1802). KIM: oldcomputers.net/kim1.html ELF: cosmacelf.com
mctylr
Probablemente fue algo como lo que dijo mctylr. En las máquinas de este tipo, generalmente había un pequeño programa 'monitor' en ROM. Cuando entró en bytes con el teclado, en realidad fue el 6502 (o 8085 o lo que sea) la lectura de las teclas, la modificación de la memoria, la actualización de los LEDs, etc.
JustJeff
1

Los primeros microprocesadores habrían sido programados con la ayuda de computadoras existentes que no estaban basadas en microprocesadores. Antes de que se produjera la primera CPU en un chip, ya existían arquitecturas informáticas avanzadas que se construyeron a partir de componentes discretos en lugar de microprocesadores. Echa un vistazo a, por ejemplo, IBM 360.

Kaz
fuente