Embrace your inner PDP-11

J'ai le même dans ma chambreUn 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!

Vus : 839
Publié par Etenil : 58