¿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",