Embrace your inner PDP-11
Un petit billet inhabituel pour changer, mais toujours en rapport avec le logiciel malgré tout.
Il est des machines qui sont un un point tournant dans l'histoire. La machine à vapeur, l'ordinateur, l'iPad... ah non pas celui-ci. Bref, je vais m'intéresser à LA machine emblèmatique des premiers hackers et fondatrice du logiciel libre, puisque Richard Stallman a programmé les premiers morceaux de GNU dessus (EMACS et GCC). Je veux bien entendu parler du PDP de DEC.
Le labo d'intelligence artificielle du MIT où RMS travaillait avait tout d'abord un PDP-8 avant de passer au PDP-10. Ces ordinateurs sont des mainframes, dédiés à êtres des ordinateurs centraux avec de nombreux terminaux. Ces engins prédatent Unix, et ils étaient souvent accompagnés d'un système d'exploitation nommé CTS, pour "Compatible Time-sharing System", ou Système Compatible à Temps partagé en langue de Molière. Les hackers du MIT quant à eux avaient conçu leur propre système d'exploitation multi-utilisateur qu'ils avaient appelé parodiquement ITS pour "Incompatible Time-sharing System"; bon nombre des fonctionnalités de ce système étaient très en avance sur leur temps comme le support de système de fichiers en réseau, noyau supportant opérations temps réel et partagés, partage des cycles asynchrones pour les tâches utilisateur et débugueur intégré à l'OS (permettant d'arrêter l'exécution de n'importe quel programme et d'en analyser l'état, avec reprise d'exécution sans conséquence).
On peut toujours trouver ITS et l'installer sur un émulateur de PDP, voire un vrai PDP si on a assez de place chez soi. Mais pour commencer, j'ai préféré jouer avec quelque chose qui nous est plus familier: UNIX6. Cette version d'UNIX est sortie en 1975, et beaucoup d'eau a coulé sous les ponts depuis. J'ai installé l'émulateur simh, présent dans beaucoup de distributions, puis suivi les instructions de gunkies.org afin de pouvoir l'installer. Je vais vous traduire le modus operandi et tenter d'expliquer ce qu'on fait.
Pour la suite, il est intéressant de noter que simh reproduit le fonctionnement de l'appareil. Les boutons roses en dans l'image de l'article étaient en fait utilisés pour programmer le PDP. Un sélecteur permettait de sélectionner un registre ou la mémoire et on chargeait un mot avant de l'envoyer à l'adresse désirée. Vous en verrez l'usage lorsque nous booterons UNIX (le PDP n'avait pas de bios, donc il faut initialiser le boot à la main).
Tout d'abord, récupérez l'image de bande d'UNIX, puis renommez le fichier en dist.tap (faites en une copie de sauvegarde au cas où) démarrons simh, sur Fedora, la commande est:
simh-pdp11
Maintenant, nous allons charger le bootloader d'UNIX dans le disque du PDP comme suit:
set cpu 11/40 set tm0 locked attach tm0 dist.tap attach rk0 rk0 attach rk1 rk1 attach rk2 rk2 d cpu 100000 012700 d cpu 100002 172526 d cpu 100004 010040 d cpu 100006 012740 d cpu 100010 060003 d cpu 100012 000777 g 100000
Toute la série avant les d cpu sont particulières à l'émulateur; on décrit le matériel qu'on souhaite avoir. Notez la partie attach tm0 dist.tap
, dans laquelle nous connectons un lecteur de bande avec la bande d'UNIX. Ensuite on passe des instructions en langage machine afin d'initialiser le lecteur de bande et enfin on exécute du code sur la bande.
Le simulateur va se verrouiller à ce moment-ci. Débloquez le en appuyant sur ctrl+e. Puis entrez l'instruction:
g 0
Le PDP va booter et afficher un signe "=". Tapez les instructions comme suit pour formater les bandes:
=tmrk disk offset 0 tape offset 100 count 1 =tmrk disk offset 1 tape offset 101 count 3999 =
Enfin appuyez sur ctrl+e, puis entrez q pour quitter l'émulateur. Nous avons maintenant notre disque de boot tout prêt et le lecteur de bande est formaté pour UNIX.
Il est temps maintenant de booter en mode utilisateur seul afin d'installer UNIX à proprement parler. Avant de commencer, quelques avertissements. Le terminal ne se comporte pas de la même manière que d'habitude. Essentiellement car il émule un télétype et qu'on ne peut pas effacer sur le papier, donc pas de touche backspace. La touche backspace marche, mais elle efface toute la ligne sans afficher l'effacement. Le mieux est de relire plusieurs fois ce qu'on tape et de prendre son temps. Sinon effacez avec backspace, puis tapez sur entrée et retapez toute la ligne (ou profitez des terminaux modernes en copiant-collant ;)). Allons-y:
set cpu 11/40 set tto 7b set tm0 locked attach tm0 dist.tap attach rk0 rk0 attach rk1 rk1 attach rk2 rk2 dep system sr 173030 boot rk0
Maintenant vous devriez voir affiché un symbole "@". Démarrez UNIX en mode seul en tapant rkunix
. Ensuite on nettoiera le terminal en passant la commande:
STTY -LCASE
Première chose à faire maintenant, recompiler le noyau d'UNIX.
chdir /usr/sys/conf cc mkconf.c mv a.out mkconf
Lancez mkconf (pour configurer le futur kernel) et entrez les infos suivantes:
# ./mkconf rk tm tc 8dc lp done #
Maintenant on va compiler la configuration et y lier le reste du noyau comme suit:
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
On peut vérifier que le noyau est bien installé et fait 30kb (on est loin des noyaux modernes hein!):
# ls -l /unix -rwxrwxrwx 1 root 30346 Oct 10 12:43 /unix
Pas d'udev!!! Donc pas de fichiers de périphériques dans /dev. Heureusement, on peut le faire à la main (on n'a pas le choix d'ailleurs). Je vous conseille de copier/coller cette partie là.
/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*
Et maintenant on va copier le reste d'UNIX sur les disques du PDP. Attention aux commandes dd, surnommé à juste titre "disk destroyer". Prenez votre temps ou copiez/collez.
dd if=/dev/mt0 of=/dev/rk1 count=4000 skip=4100 /etc/mount /dev/rk1 /usr/source dd if=/dev/mt0 of=/dev/rk2 count=4000 skip=8100 mkdir /usr/doc
On va monter le reste du système et configurer les montages automatiques (très lointain ancètre du système d'init et fstab, vous allez voir...)
/etc/mount /dev/rk1 /usr/source /etc/mount /dev/rk2 /usr/doc # cat >> /etc/rc /etc/mount /dev/rk1 /usr/source /etc/mount /dev/rk2 /usr/doc
Entrez la combinaison de touche ctrl+D pour en finir avec cette dernière commande. Nous allons maintenant nous occuper de la commande df qui ne savait pas deviner où étaient les disques, donc on doit lui indiquer leurs emplacements dans le code et recompiler. Pour cela nous allons devoir utiliser l'éditeur texte ed. Gardez bien la tête froide et prenez votre temps. Si vous trouviez VI ou EMACS hardcore, ed va vous ôter ce qui vous reste de cheveux.
# chdir /usr/source/s1 # cp df.c df.c.bak # ed df.c /rp0/d .-2a "/dev/rk0", "/dev/rk1", . w q # cc df.c # cp a.out > /bin/df
Notez que j'ai fait une copie de sauvegarde au cas où. À présent nous allons vérifier les systèmes de fichiers (pas de fsck non plus à l'époque):
icheck /dev/rrk0 dcheck /dev/rrk0 icheck /dev/rrk1 dcheck /dev/rrk1 icheck /dev/rrk2 dcheck /dev/rrk2
Enfin nous allons activer le mode multi-utilisateur et rebooter. Enfin rebooter... Disons qu'on sync les disques plusieurs fois avant d'éteindre violemment l'appareil (ctrl+e puis q).
# ed /etc/ttys 1,8s/^0/1/p w q # # sync # sync # sync # sync
Maintenant on peut utiliser UNIX normalement, en multi-utilisateur. Vous pouvez d'ailleurs vous y connecter en telnet sur le port 5555. Copiez le code qui suit dans un fichier boot.ini, puis lancez avec la commande simh-pdp11 boot.ini
:
set cpu 11/40 set cpu idle set tto 7b set tm0 locked attach rk0 rk0 attach rk1 rk1 attach rk2 rk2 attach lpt printer.txt set dci en set dci lines=8 set dco 7b att dci 5555 boot rk0
Le lancement ressemble à:
PDP-11 simulator V3.8-1 Disabling XQ Listening on port 5555 (socket 108) @unix login: root #
Connectez-vous en tant que root, sans mot de passe.
Bon il n'y a pas tellement à faire, mais c'est intéressant de voir ce qui a changé (assez peu en fait) en 37 ans. Je suis en train de voir si je pourrais éventuellement porter la toute première version de VI (appelé ex) de 1BSD vers UNIX6, mais ça n'est pas tâche facile. Je vous tiendrais au courant!