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.
microprocessor
Decano
fuente
fuente
Respuestas:
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 ).
fuente
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 :
fuente
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
fuente
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.
tienda de control de matriz de diodos de la computadora Whirlwind de 1950 MIT
tienda de control de matriz de transistores de 2005 la CPU MT15
fuente
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.
fuente
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
fuente
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.
fuente
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.
fuente
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.
fuente