¿Cómo se cargaron los programas en la memoria antes de que existieran los sistemas operativos? ¿Cómo se instaló el primer sistema operativo en la memoria?

Restablecer vector Esta es la ubicación de la primera instrucción que ejecutará una CPU cuando se active. El Vector de reinicio está conectado a la CPU. Esta es la tetina que alimenta la CPU con el programa bootstrap. El programa bootstrap carga todo lo demás.

La computadora muy temprana no tenía vectores de reinicio. En cambio, fueron cableados para resolver problemas específicos

Cuando llegaron las computadoras programables, cada una de ellas tenía su propia “implementación” de un vector de reinicio. Comenzarían a leer las instrucciones de un lector de tarjetas perforadas o una cinta magnética. Cuando había múltiples fuentes, el operador tenía que alternar un interruptor antes de arrancar para indicarle a la computadora dónde comenzar a cargar las instrucciones

Para cuando las microcomputadoras y las computadoras personales se hicieron populares, el vector de reinicio se cambió para señalar una dirección de memoria. Por lo general, esta dirección de memoria apunta a una ubicación dentro de una ROM o una ROM programable que está integrada en la placa de circuito de la computadora. El fabricante de la computadora instala el firmware en la ROM / PROM. En una PC basada en IBM, este firmware se llamaba BIOS y era responsable de cargar el sistema operativo. Por lo general, el BIOS está configurado para escanear las diversas entradas para el sistema operativo. Por ejemplo, primero podría ver la unidad de disquete, luego la unidad de CD y luego el disco duro.

O en algunos equipos, todo el sistema operativo podría grabarse en la ROM. Tenía un espectro ZX en 1988, y ese tenía el sistema operativo en BIOS. El sistema operativo era un intérprete BASIC ligero que traduciría los comandos BASIC en comandos para el hardware. Cuando la máquina arrancó, mostró un mensaje en la interfaz de usuario que le permitió ingresar instrucciones BÁSICAS. Podría escribir un programa BASIC completo allí mismo y lo ejecutaría. No tenía un disco duro. Tenía una unidad de cinta. Si desea cargar un programa desde la unidad de cinta, debe escribir las instrucciones en el indicador de comando.

Soy un poco demasiado joven para haber vivido eso. Pero he visto alguna tecnología disponible incluso en el momento en que las primeras computadoras ayudaron aquí: Tarjeta perforada – Wikipedia

Mi universidad todavía tenía unos pocos escritores y lectores de tarjetas perforadas en 1980 cuando llegué a mi laboratorio FORTRAN. Como era tecnología obsoleta incluso entonces, era el equipo adecuado para estudiantes humildes 🙂

No subestimes a los pioneros de la informática: eran tan inteligentes e inteligentes, si no más, que los ingenieros de hoy. Así que estoy bastante seguro de que una de las primeras cosas que hicieron fue conectar un lector de tarjetas perforadas o un lector de cinta de papel de 5 u 8 agujeros a su máquina y escribir un pequeño programa en código binario que se lee en una pila de tarjetas o un rollo de papel con un programa y luego lo inicia.

¿En cuanto a cómo ingresar el programa binario? Echa un vistazo al panel frontal de un PDP8:

(Foto: Florian Schäffer)

El PDP8 se remonta a mediados de los años 60 y esos interruptores se usaron al inicio para ingresar primero una dirección de memoria y algunas docenas de instrucciones binarias con un programa de carga. Lo hice solo por diversión, una vez, cargando el sistema operativo desde una cinta. Normalmente, la máquina funcionaba las 24 horas del día, los 7 días de la semana, sin nada más que hacer que proporcionarnos una plataforma para jugar ‘Dungeon’.

Por supuesto, está muy lejos de una computadora con solo unos pocos conmutadores a un sistema operativo, pero los sistemas operativos eran MUCHO más pequeños al principio. Mi primer sistema operativo, CP / M, tenía solo unos pocos kilobytes de tamaño. Después de todo, la cantidad MÁXIMA de memoria que un procesador 8080 o Z80 podía manejar era de 64 kBytes.

Y Windows 10 es de alguna manera un descendiente directo de CP / M, ya que MS-DOS no era más que un clon de CP / M.

Así que ya ves, nada, solo un montón de trabajo duro balanceando los interruptores hasta que encuentres una manera más fácil de hacerlo.

Para mi primer curso de lenguaje ensamblador (hace muchas lunas), me asignaron a escribir un programa para una computadora PDP-8 que uniría dos máquinas de teletipo para que cada vez que se presionara una tecla en una máquina, el personaje se imprimiera en la otra. (Una especie de programa de chat de la edad de piedra).

El PDP-8 no tenía sistema operativo y la forma en que cargué el programa fue ingresar las instrucciones en el código de la máquina, una instrucción a la vez, a través de un conjunto de interruptores en el panel frontal de la máquina. Configuraría los interruptores (un interruptor por bit) para el siguiente código de instrucción y luego presionaría un interruptor especial “enter” que cargaría esa instrucción en la siguiente ubicación de memoria. También había un interruptor de “ejecución” que podía presionar para comenzar la ejecución del programa una vez que se cargaban todas las instrucciones. Como recuerdo, también había un interruptor para detener la ejecución, uno para ejecutar solo la siguiente instrucción y algunos otros interruptores de control.

Si no es obvio, todo el desarrollo del programa se realizó con lápiz y papel. No hace falta decir que todo el proceso de desarrollo y depuración del programa fue dolorosamente tedioso. La parte más difícil de la depuración fue tratar de examinar los puertos de E / S cuando las cosas salían mal, para ver qué datos enviaban y recibían las máquinas de teletipo. Una peculiaridad del hardware PDP-8 fue que leer el valor del puerto, incluso a través del panel frontal, borraba cualquier dato que pudiera haber estado allí. Esto significaba que cada vez que miraba el valor del puerto, tratando de averiguar por qué las cosas no funcionaban, destruía el estado de mi programa. Si el valor del puerto no me decía lo suficiente como para corregir el error, tenía que reiniciar completamente el programa y volver a ingresar toda la entrada solo para volver al mismo estado, desde el cual podría avanzar a la siguiente instrucción.

Esta experiencia mejoró enormemente mi apreciación de los compiladores y sistemas operativos cuando finalmente tomé cursos en esas áreas.

En la década de 1970 trabajé en un Ferranti FM1600B. Eso tenía memoria de núcleo magnético y chips RTL (lógica de resistencia-transistor, un precursor de TTL). En el panel frontal, tenía un conjunto completo de interruptores de palanca: una palabra binaria completa, en bits, un interruptor para cada bit. Olvidé los detalles exactos, pero básicamente podría configurar una dirección en binario en los interruptores, presionar un botón para cargarla en el registro de direcciones, luego establecer una palabra de datos en los interruptores y presionar otro botón para cargarla en la memoria. Había 64K direcciones como recuerdo. En principio, podría cargar un programa completo como ese. Luego, debe ingresar una dirección de inicio en los interruptores y presionar un botón y la computadora comenzará a ejecutarse en esa dirección. Eso sería extremadamente lento, por lo que solo lo hicimos para parchear en vivo, cambiando algunas palabras de un programa. Para arrancar la computadora normalmente, giró un interruptor multidireccional unos 10 clics. Eso cargó un programa de arranque corto, codificado en una matriz de diodos (es decir, cada bit era fácilmente visible, aproximadamente 4 mm x 2 mm). Cuando se ejecutó este programa, leyó una sección de cinta de papel de 5 agujeros en la memoria desde un lector de cinta. Eso contenía un programa de arranque más largo escrito en cinta de papel de 8 agujeros. Eso, a su vez, pudo leer el programa normal completo de 3 rollos grandes de cinta de papel, o alternativamente de una unidad de cinta magnética de carrete de 10 “. Una vez que el programa estaba en la memoria, la RAM central no era volátil, por lo que podía encender la computadora, saltar a una dirección en particular e iniciarla. El sistema en el que trabajé nunca tuvo un sistema operativo real tal como lo entendemos: el programa en ejecución controlaba un sonar de la Armada, y eso fue todo lo que hizo. No tenía controladores de dispositivo como los entenderíamos: controlaba el hardware directamente. No había línea de comando o interfaz GUI: el programa mostraba contactos de sonda en una pantalla, y un operador podía mover un marcador sobre ellos con una bola de seguimiento y etiquetarlos con nombres con un teclado, pero no podía ingresar comandos como tales.

Un poco más tarde, compré mi primera computadora personal: un kit de evaluación National Semiconductor SC / MP. Eso tenía un sistema operativo primitivo programado en una ROM de 513 bytes, un teclado calculador y una pantalla LED de 7 segmentos. Cuando se reiniciaba la CPU (se activaba o la línea de reinicio se bajaba), comenzaba a ejecutarse en una dirección ROM particular. El “sistema operativo” esperaría la entrada de tecla desde el teclado. Ingresé programas en lenguaje máquina, en hexadecimal, y luego comencé a ejecutarlos. El primer programa de ejemplo mostró, en 7 segmentos, “dld G00d”, el equivalente de HELLO WORLD, pero W y R eran imposibles en una pantalla de 7 segmentos. Más tarde, escribí una interfaz de cinta de cassette y la grabé en una EPROM, que extendió la memoria del sistema para poder almacenar y cargar programas sin tener que ingresarlos desde cero (la RAM de estado sólido es volátil, como ahora).

A principios de los años setenta, las microcomputadoras << corrección, minicomputadoras >> tenían el programa bootstrap cargado a través del monitor del panel. La metáfora de levantarse con las botas era vívida entonces. Un pequeño programa, insertado en un monitor de panel de minicomputadora Perkin Elmer en octal, luego cargó un pequeño programa de las bandejas de disco, que luego cargó el sistema operativo básico, que luego cargó el sistema operativo completo.

Pero no sé cómo se cargaron los programas en los años cincuenta sin un sistema operativo. Creo que podrían haber sido configurados directa y laboriosamente con interruptores y luego configurados en ejecución. Una novela que leí sobre una computadora de finales de los años 50 tenía el programa de aplicación leído en cinta de papel perforada. Entonces, tal vez también ingresaron a un pequeño programa con interruptores y luego leyeron en un programa ejecutivo que leía la aplicación que habría sido el ÚNICO programa en ejecución.

Las primeras computadoras se construyeron con tubos de vacío y la programación se realizó configurando manualmente los interruptores de relé (al igual que los operadores de centralitas telefónicas del mismo período de tiempo). Las computadoras de segunda generación llegaron con la invención de los transistores. Estas computadoras tenían memoria y sistemas operativos, y los medios de almacenamiento eran cintas magnéticas. Se inventaron docenas de lenguajes de bajo nivel y los programas se codificaron en pilas de “tarjetas perforadas” para cargar el programa en la memoria de la computadora. Una broma común entre los programadores era deslizar una tarjeta en blanco o una nota tonta en una pila de tarjetas de programadores. RPG fue uno de los primeros lenguajes de “transición” que se alejó de las tarjetas perforadas hacia aplicaciones compiladas modernas que se podían cargar rápidamente en la memoria sin requerir un mecanismo físico. En cuanto a su segunda pregunta, los primeros sistemas operativos se codificaron en la computadora y cada fabricante tenía un teclado único con diferentes botones codificados para realizar funciones especializadas para aumentar el funcionamiento de la computadora invocando comandos más allá del alcance del sistema operativo o programa funciones

Los primeros lenguajes de programación se escribieron en ensamblador y se cargaron mediante tarjetas perforadas o interruptores. Una vez que obtenga un lenguaje de programación, puede escribir lenguajes de programación más avanzados más fácilmente hasta que alcance un lenguaje de programación de alto nivel que pueda desarrollar un sistema operativo.

Esto saldrá conmigo. Oh bien. De vuelta en no importa cuánto tiempo hace, operé una computadora del tamaño de un microondas con una enorme cantidad de 8k de memoria. Para cargar un programa, comencé ingresando aproximadamente 8 instrucciones de lenguaje de máquina encendiendo y apagando los interruptores, cada interruptor representa un bit de un código de 8 bits. Después de cada instrucción, presioné un botón de “paso” para cargar esa instrucción en la memoria. Una vez que ingresaron los 8, puse. Una tira corta de cinta de papel perforada (el cargador de arranque) en un lector. Todo estaba en octal.

Presioné ejecutar y mis instrucciones ingresadas cargaron el cargador en la memoria. Entonces podría poner la cinta para el sistema operativo TINY en el lector para cargar. AHORA finalmente pude cargar un programa, desde una cinta de papel perforado.