Ubuntu Peronista@TTBP

Este es un espejo en el Tilde Blog Project del blog original Ubuntu Peronista. Se encuentra disponible en Tildeverso únicamente con fin histórico.



10 november 2021

¿Cómo puedo emular una DEC PDP-11 o Unix desde Ubuntu?

En 1970, mientras conversaba en Puerta de Hierro con Vicente Solano Lima para disponer la creación de La Hora del Pueblo, Juan Perón exponia también sobre cómo emular Unix 6 en una DEC PDP-11 virtualizada desde Ubuntu.

Vea Solano, el Justicialismo no nace de un repollo, sino que crece como respuesta a la injusticia que significa la explotación del hombre por el hombre en nuestro país. En la Argentina - como en muchos lados del globo - dicha explotación se representaba por un concetrado sector Capitalista oprimiendo a las fuerzas del trabajo. Tal problema podía ser expuesto por muchos ya en aquél entonces, pero requería una solución que fuese original y Argentina. Esta solución es el Justicialismo. Ahora una camarilla cipaya nos quiere dejar afuera de la torta, pero verán que con poco les agriamos el dulce.

Así como nuestra Doctrina, los sistemas operativos GNU con Linux tampoco salen de un repollo: son lógica evolución de mecanismos informáticos pretéritos pensados para afrontar los problemas computacionales de aquella era: el Unix. Este sistema multitarea multiusuario privativo conforma la base instrumental del sistema operativo libre GNU, y por tanto puede decirse sin temor a equivocarnos, que si bien la filosofía que lo mueve no es la misma, el GNU con Kernel Linux (de la cual Ubuntu es una de sus tantas distribuciones) es efectivamente un sistema operativo similar a Unix.

Unix se ejecutaba principalmente en miniordenadores, vetustas máquinas electrónicas de gran costo, cuyo nombre no deja de engañar pues la mayor parte tenían varios módulos del tamaño de una heladera Siam.

Con el tiempo, el form factor se redujo, y ya las cada unidad de trabajo tenía el tamaño de un lavarropas Koh-i-Noor, o de un microondas. En estos días ya no es raro encontrar GNU con Linux corriendo tanto en las máquinas mas enormes y potentes como en los aparatitos más simples. ¿Qué sucede si queremos emplear alguno de esos programas o versiones antediluvianas de Unix? ¿O si queremos emplear una antigua mini, como la clásica PDP-11? Idealmente deberíamos contar con dicha máquina y el software. Pero el Justicialismo ha sido puesto en ejecución en este mundo para permitirnos hacer todo sin pagar un mango. Por ello, los grandes hombres del país se han abocado a desarrollar SIMH.

Se trata de un emulador completo de miniordenadores: simula la Unidad Central de Proceso, el uso de memoria, el firmware y los dispositivos de una gran variedad de equipos de la vieja escuela. Esto significa que el software original puede correrse sin modificación alguna de manera virtualizada en un equipo moderno. SIMH simula con éxito dispositivos como las unidades de cinta magnética, impresoras y dispositivos de comunicación en red, de manera tal que no sólo se podría ejecutar software histórico, sino que podremos comunicarnos y transferir información desde y hacia ellos empleando tecnologías y protocolos actuales.

Entre los equipos contemplados se encuentra el Eclipse de Data General Noval, los seminales PDP-1, PDP-4, PDP-7, PDP-8, PDP-9, PDP-10, PDP-11, PDP-15, y VAX de la Digital Equipment Corporation (DEC), las GRI-909 y GRI-99 de GRI Corporation, los minis 1401, 1620, 1130, 7090/7094, y el System/3 del gigante azul IBM, los sistemas 16b y 32b de Interdata (Perkin-Elmer), las mini 2114, 2115, 2116, 2100, 21MX, 1000 de Hewlett-Packard, la completa H316/H516 de Honeywell, el fundacional Altair 8800 de MITS (tanto en sus versiones con microprocesador Intel 8080 como la munida del Zilog Z80). También puede correr como si fuesen los Royal-Mcbee LGP-30, LGP-21, y los SDS 940 y SWTP 6800 de la Scientific Data Systems.

Como primer medida, instalo el paquete SIMH. Abro una terminal con Ctrl+Alt+T e ingreso el siguiente Comando de Organización:

sudo apt-get install simh

Tras ingresar nuestra contraseña de Conductor de Ubuntu, se instalarán las rutinas de emulación de la PDP11 así como de los otros miniordenadores soportados. Nuestra tarea importante será la inauguración una carpeta donde depositaremos una copia binaria de los diskettes de 7 pulgadas que componían sistema operativo Unix v6 portado para la PDP-11. Todo ello se hace con los siguientes Comandos en la consola Linux:

mkdir ~/simh ~/simh/unix6/ cd ~/simh/unix6/ wget http://simh.trailing-edge.com/kits/uv6swre.zip unzip -a uv6swre.zip

Ejecutamos el emulador de la PDP11 con:

pdp11

Esto nos presentará resultados en la Terminal. En primer lugar nos presentará la versión del emulador, y luego se hará presente un prompt, señal de que estamos dentro del simulador ("sim>").

PDP-11 simulator V3.8-1 sim>

Este prompt aceptará comandos previstos para configurar los aspectos de la máquina PDP-11 (por ejemplo, establecer una versión de CPU específica que tenga virtualmente instalada, cargar las unidades de cinta o disco virtualizadas con archivos de imágenes binarios, y dar arranque a la PDP-11).

Empezamos a ingresar comandos para configurar la máquina PDP-11, y cargarle los diskettes de sistema.

Para mayor facilidad y comprensión de las Masas encuadradas en el país, indicaré los mensajes completos que presentará el emulador a través de su prompt en color negro. En color azul os indicaré los comandos que los Descamisados habrán de tipear en el emulador para ponerlo a punto (naturalmente, también podrán pegarlos y ejecutarlos con Enter). En tanto, en color celeste os indicaré los contenidos que no son comandos propiamente dichos, pero que han de tipearse también en el emulador y confirmarse con Enter.

PDP-11 simulator V3.8-1 sim> set cpu u18

Esto instruirá al emulador a simular una CPU de DEC modelo U18, una de las clásicos cerebros electrónicos de la PDP-11.

Si todo va bien, nos debería indicar "Disabling XQ". A continuación cargaremos las cuatro imágenes de disco flexible de 8 pulgadas que componían el intérprete de comandos del Unix 6. Para ello daremos usos a las disketteras virtualizadas ("rkx") de las que dispone el emulador. Lo haremos con las siguientes órdenes:

sim> att rk0 unix0_v6_rk.dsk sim> att rk1 unix1_v6_rk.dsk sim> att rk2 unix2_v6_rk.dsk sim> att rk3 unix3_v6_rk.dsk

...esto emulará el procedimiento de cargar los discos magnética en las disketteras virtuales y las transferirá a la memoria núcleo de nuestra PDP-11 virtual. Ya podremos dar arranque al sistema en el emulador, a través de su diskettera virtual inicial (la rk0). Esto se realiza con:

sim> boot rk0

De no sufrir problemas, nuestra terminal debería responder cambiando su prompt al signo de carga de sistema operativo, el cual es una arroba "@". Con ella, el emulador nos está pidiendo que indiquemos qué sistema operativo queremos cargar (Unix es el único que tenemos, de modo que le indicaremos "unix" (sin las comillas).

@unix

Acto seguido nos solicitará nuestro usuario ("login:"). El mismo es "root" (sin las comillas).

@login: root

Al ingresar como usuario root, el prompt cambiará a un símbolo numeral "#". Ya estamos en Unix, y podremos navegar en el árbol de directorios con los comandos Unix, tales como:

ls -l --> lista completamente un directorio.

chdir /usr/ --> cambia al directorio /usr/

chdir .. --> sube un nivel en la estructura de directorios.

Para cancelar un programa podríamos usar Ctrl+D, cancelar el emulador con Ctrl+E, o si estamos en el prompt, podemos ingresar:

exit

...y el sistema nos devolverá al prompt de Linux con una despedida "Googbye".

UNIX interactivo En cambio, si queremos un Unix que pueda comunicarse con otros dispositivos conectados al sistema para permitir un trabajo más completo y avanzadas, compilar programas antiguos o directamente correr en situaciones de emulación "dura" (dispositivos compatibles antiguos que quisieran comunicarse con el sistema emulado), habremos de usar otra versión de Unix 6 provista de los parches necesarios.

Os indicaré como hacerlo bajo la gracia del Justicialismo, pues un Conductor ha de llevar la auténtica felicidad al Pueblo.

Como tenemos un requerimiento especial, descargaremos una versión especial armada por Ken Wellsch, y la modificaremos. Abrimos con tal fin una consola Terminal e ingresamos los siguientes Comandos de Organización:

mkdir ~/simh ~/simh/unixv6HP cd ~/simh/unixv6HP wget http://sourceforge.net/projects/bsd42/files/Install%20tapes/Research%20Unix/Unix-v6-Ken-Wellsch.tap.bz2 bzip2 -d Unix-v6-Ken-Wellsch.tap.bz2

Para ejecutar el emulador de la DEC PDP-11 introduzco en la Terminal el comando:

pdp11

Esta vez emularemos una PDP-11 con CPU del modelo 11/40, y tomaremos algunas consideraciones especiales en cuanto a la reserva de memoria para dar arranque y compilar. Nuevamente, lo haremos introduciendo los comandos marcados en color azul.

PDP-11 simulator V3.8-1

sim> set cpu 11/40

Disabling XQ sim> set tm0 locked sim> attach tm0 Unix-v6-Ken-Wellsch.tap sim> attach rk0 rk0

RK: creating new file sim> attach rk1 rk1

RK: creating new file
sim> attach rk2 rk2

RK: creating new file
sim> d cpu 100000 012700 sim> d cpu 100002 172526 sim> d cpu 100004 010040 sim> d cpu 100006 012740 sim> d cpu 100010 060003 sim> d cpu 100012 000777 sim> g 100000

Aquí presionamos Ctrl+E para detener la simulación: El emulador devolverá "Simulation stopped, PC: 100012 (BR 100012)". Ahora indicamos que ejecute el programa de inicio desde la posición 0 de memoria. lo hacemos con "g 0":

Simulation stopped, PC: 100012 (BR 100012) sim> g 0

Si todo va bien, el prompt cambiará a un "=". Seguimos intruduciendo comandos para calibrar el tamaño de las particiones de los discos virtuales:

=tmrk disk offset 0 tape offset 100 count 1 =tmrk disk offset 1 tape offset 101 count

3999

Ahora presionamos Ctrl+E para detener la emulación. El emulador nos devolverá:

Simulation stopped, PC: 137274 (TSTB @#177560) sim> q Goodbye

Nos devolverá a nuestra Terminal Linux con el prompt de usuario de sistema GNU. Reingresaremos al emulador de PDP-11 y esta vez iniciaremos desde un disco rígido virtual:

pdp11

Arrancará el emulador, e introduciremos los comandos marcados en azul correspondientes para prepararlo:

PDP-11 simulator V3.8-1

sim> set cpu 11/40 Disabling XQ

sim> set tto 7b sim> set tm0 locked sim> attach tm0 Unix-v6-Ken-Wellsch.tap sim> attach rk0 rk0 sim> attach rk1 rk1 sim> attach rk2 rk2

sim> dep system sr 173030 sim> boot rk0

...con esta última orden boot rk0, se dará arranque la unidad de disco virtualizada 0 dentro del nuestra DEC PDP-11 virtual. Esto hará que el prompt cambie a una arroba "@", señal del inicio del módulo de booteo (arranque de sistema). La PDP-11 nos solicita que indiquemos cuál sistema arrancar de los que están cargados en la unidad virtualizada 0. Le indicaremos "rkunix" de modo que quede presentado de la siguiente manera:

@rkunix

...Y al confirmar con Enter el sistema nos devolverá la información relevante si la operación tuvo éxito:

mem = 1035 !!RESTRICTED RIGHTS !! !!Use, duplication or disclosure is subject to !!restrictions stated in Contract with Western !!Electric Company, Inc. !!#

Conforme Unix haya arrancado en la PDP-11 emulada, procederemos a corregir algunos problemas que esta versión particular del sistema operativo tenía. En primer lugar, arreglamos la presentación del texto para que pueda usar minúsculas. Originalmente el Unix V6 estaba pensado para su ejecución en terminales de video con escasa memoria de video, y que por ello eran incapaces de mostrar también tipografía en minúscula. Este ajuste de configuración será fácil con la siguiente instrucción:

STTY -LCASE

Ahora configuraremos dispositivos adicionales para que pueda usarlos el Unix emulado. Para ello nos movemos al directorio /usr/sys/conf/ dentro del Unix emulado con el comando chdir (antecesor del comando cd de GNU/Linux):

chdir /usr/sys/conf

cc mkconf.c

mv a.out mkconf

Ahora ejecutaremos el programa mkconf (que nos permite ordenar los módulos a los que queremos dar uso con nuestro Unix). Le indicamos los módulos rk, tm, 8dc, y lp, (discos, cintas, impresora de línea, puerto serial tipo Centronics) y concluiremos el uso del programa con la instrucción done:

./mkconf

rk tm tc 8dc lp done #

...acto seguido podremos compilar esta configuración, enlazarla dinámicamente al resto del kernel, y copiarla al directorio /unix sito en la raíz del sistema opereativo emulado:

as m40.s

mv a.out m40.o

cc -c c.c

as l.s

ld -x a.out m40.o c.o ../lib1 ../lib2

mv a.out /unix

...para verificar que se haya movido correctamente, podrán proceder a listar el directorio /unix en la PDP-11 virtualizada, observando que el kernel ahora debería reportar un tamaño de 30.346 bytes (unos 30 kilobytes):

ls -l /unix

-rwxrwxrwx 1 root 30346 Oct 10 12:35 /unix

Unix opera "a pelo". Por eso ya podremos crear nosotros mismos los archivos de dispositivos (como los puestos de terminal de teletipo, las unidades de cinta y disco magnético, los puertos de impresora de línea, etc). Simplemente copiamos los siguientes comandos en el prompt de la PDP-11:

/etc/mknod /dev/rk0 b 0 0

/etc/mknod /dev/rk1 b 0 1

/etc/mknod /dev/rk2 b 0 2

/etc/mknod /dev/mt0 b 3 0

/etc/mknod /dev/tap0 b 4 0

/etc/mknod /dev/rrk0 c 9 0

/etc/mknod /dev/rrk1 c 9 1

/etc/mknod /dev/rrk2 c 9 2

/etc/mknod /dev/rmt0 c 12 0

/etc/mknod /dev/lp0 c 2 0

/etc/mknod /dev/tty0 c 3 0

/etc/mknod /dev/tty1 c 3 1

/etc/mknod /dev/tty2 c 3 2

/etc/mknod /dev/tty3 c 3 3

/etc/mknod /dev/tty4 c 3 4

/etc/mknod /dev/tty5 c 3 5

/etc/mknod /dev/tty6 c 3 6

/etc/mknod /dev/tty7 c 3 7

chmod 640 /dev/rk

chmod 640 /dev/mt

chmod 640 /dev/tap

Ya creados los archivos donde se dirigirán los resultados de los dispositivos, restauramos el resto del sistema operativo:

dd if=/dev/mt0 of=/dev/rk1 count=4000 skip=4100

4000+0 records in 4000+0 records out

/etc/mount /dev/rk1 /usr/source

dd if=/dev/mt0 of=/dev/rk2 count=4000 skip=8100

4000+0 records in 4000+0 records out

mkdir /usr/doc

Ahora uso cat para unir los estamentos de arranque del sistema:

/etc/mount /dev/rk1 /usr/source

mount: Mount device busy

/etc/mount /dev/rk2 /usr/doc

cat >> /etc/rc

/etc/mount /dev/rk1 /usr/source /etc/mount /dev/rk2 /usr/doc

Aqui presiono Ctrl+D. Luego crearemos un directorio y modificaremos con el editor ed la programación del comando df para que no presente errores en el emulador:

chdir /usr/source/s1

ed df.c

1282 /rp0/d .-2a "/dev/rk0", "/dev/rk1", . w 1297 q

cc df.c

cp a.out > /bin/df

Revisamos los sistemas de archivos. Como por entonces no existía el programa fsck, esta comprobación se hacía mediante la combinación de los programas icheck y dcheck, que devolvían el estado de los dispositivos de disco y nos reportaban cuál era el archivo de dispositivo real que tenían asignado. Los operaremos ingresando los comandos indicados en azul de la siguiente manera:

icheck /dev/rrk0

/dev/rrk0: spcl 22 files 294 large 96 direc 25 indir 96 used 2918 free 995

dcheck /dev/rrk0

/dev/rrk0:

icheck /dev/rrk1

/dev/rrk1: spcl 0 files 596 large 98 direc 34 indir 98 used 2978 free 935

dcheck /dev/rrk1

/dev/rrk1:

icheck /dev/rrk2

/dev/rrk2: bad freeblock missing 1499 spcl 0 files 337 large 69 direc 25 indir 69 used 2222 free 192

dcheck /dev/rrk2

/dev/rrk2: #

Como el archivo /etc/ttys/ provisto no escucha los puertos de comunicación seriales tipo Centronics en su configuración predeterminada, volveremos a usar el editor ed para modificar su programa de control:

ed /etc/ttys

112 1,8s/^0/1/p 170 w 112 q #

Reinicio del emulador: Como no existe un comando de reinicio en caliente en este emulador, ejecutaremos varias veces la rutina sync con el fin de sincronizar la pila de memoria, y luego Ctrl+E para interrumpir y salir del emulador:

sync

sync

sync

sync

[Oprimos Ctrl+E aqui]

Simulation stopped, PC: 002502 (MOV (SP)+,177776) sim> q Goodbye

Ahora podremos reiniciar el emulador de la PDP-11 hacer que el mismo escuche puerto TCP como si fuese serial, por ejemplo el puerto 5555:

pdp11

PDP-11 simulator V3.8-1

sim> set cpu 11/40 Disabling XQ sim> set cpu idle sim> set tto 7b sim> set tm0 locked sim> attach rk0 rk0 sim> attach rk1 rk1 sim> attach rk2 rk2 sim> attach lpt printer.txt LPT: Creating new file sim> set dci en sim> set dci lines=8 sim> set dco 7b sim> att dci 5555 Listening on port 5555 (socket 7) sim> boot rk0

Ahora podremos loguearnos a un Unix v6 parcheado y capaz de comunicarse con otros sistemas a través del puerto TCP 5555 o a través de un puerto serial Centronics, usando 7 bits de paridad estándar. Simplemente nos debemos loguear a unix ahora con el usuario root.

@unix

login: root #

Podremos movernos en los directorios de Unix con el comando chdir y listarlos con ls. Encontraremos algunos programas en el directorio /usr/ del Unix emulado. Por ejemplo, si quisiéramos ver algunos juegos, podríamos dirigirnos a ellos con:

chdir /usr/games

...listarlos con ls y dar inicio una rutina simuladora de Black Jack con:

./bj

...o jugar a un esquemático sucedáneo del Juego Ciencia, con:

./chess