domingo, 6 de abril de 2014

¿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

6 comentarios:

  1. Gracias.Buen trabajo el que compartes.Me gusto cuando digite unix y despues el login como root increible...esto de virtualizar unix en gnu linux ...pregunto:puedo acceder a los ficheros del sistema que aloja a unix?

    ResponderEliminar
    Respuestas
    1. Estimado Rigel Val:

      El sistema UNIX puede acceder a los archivos, pero en este caso se trata de una emulación de una versión 6 de Unix para la PDP-11, y mas bien bien es del tipo "sandbox", esto significa, es un sistema "encajonado" para evitar afectar al resto del sistema madre (GNU).

      Existen sin embargo, otras mismas versiones UNIX o distribuciones para el compilador que podrás encontrar gratuitamente (disponibles en imágenes de cinta .TAP, por ejemplo), las cuales cuentan con acceso FTP o Ethernet, las cuales te permiten incluso navegar por internet, chatear y compartir archivos, montar otros sistemas de disco, etc. Todo a través del mismo emulador SimH.

      Estos Unix v6 tiene esa función, pero limitado para archivos que transfieras a través del FTP del sistema (al menos, en esta compilación limitada que compartimos).

      Encontrarás también un artículo sobre SimH utilizado para emular el sistema operativo CP/M de Digital Research en una Altair 8080 (primera computadora personal), y en dicho sistema podrás compartir archivos con el sistema GNU (amén de usar programas clásicos para CP/M).

      En muy breve estaremos publicando un artículo sobre la emulación de un panel de mando de PDP-11, munida de su sistema operativo inicial (RT11), y enseñaremos cómo programar pequeñas rutinas en ensamblador mediante el viejo método de introducir "a mano" los datos en la memoria.

      Atte.

      Juan Perón

      Eliminar