Revivez la légende : UNIX 2.11BSD pour PDP-11 sur un ESP32 !

Magazine
Marque
Hackable
Numéro
46
Mois de parution
janvier 2023
Spécialité(s)


Résumé

Parfois, cela fait du bien de se souvenir du passé et du chemin parcouru, mais c'est encore mieux de le revivre. 2.11BSD est la dernière version de la branche 2BSD (Second Berkeley Software Distribution) de la famille UNIX. Édité originellement par le CSRG et l'association USENIX, ce système fonctionnait sur mini-ordinateur DEC PDP-11 et fait désormais, et pour toujours, partie de la grande histoire des UNIX. Aujourd'hui, nous allons revivre cette histoire et faire fonctionner un PDP-11 sur un simple ESP32 pour exécuter 2.11BSD !


Body

Le projet que nous allons utiliser est celui créé par Jeroen Domburg (alias Spritetm) consistant en un portage du simulateur SIMH [1] sur ESP32. Initialement développé sur une carte ESP-WROVER-KIT, il l'a ensuite décliné pour un montage sur mesure [2], prenant la forme d'un minuscule terminal VT52/IE15 équipé d'un écran LCD 320×240 pixels. Ici, faute de matériel dédié, nous allons nous en tenir à la plus simple, mais suffisante, expression du projet.

Il vous faudra une carte ESP32 équipé d'une PSRAM permettant d'étendre la mémoire vive du microcontrôleur. Il existe plusieurs modèles de cartes, Wemos ou autre, disposant de ce composant, et il est bien sûr également possible d'intégrer manuellement une PSRAM (SPI) à une carte existante. Personnellement, j'ai opté pour la solution de facilité, en réutilisant une ESP32Cam que nous avions étudiée dans le numéro 33 [3]. Celle-ci est équipée d'une PSRAM et d'un emplacement pour microSD et conviendra tout à fait. Elle a simplement été débarrassée de son module caméra et de la LED blanche (clignotant insupportablement durant les accès SD). Vous aurez également besoin d'un adaptateur USB/série, puisque l'ESP32Cam ne dispose pas d'interface permettant la programmation. Le module pourra alimenter l'ESP32 et le mode de programmation sera activé en mettant la broche IO0 à la masse juste avant le reset.

Pdp-11-70-panel-s

Crédit photo : Dave Fischer (CC BY-SA 3.0).

1. Le projet ESPPDP

Pour construire votre propre minuscule simulateur de PDP-11, vous aurez besoin de l'environnement de développement Espressif ESP-IDF (cf. l'article sur le sujet dans Hackable 34 [4]), configuré et prêt à servir (variables d'environnement initialisées avec un . export.sh). La version 5.0 vient de sortir, mais j'ai utilisé la 4.4.1, et le créateur du projet initial a vérifié le bon fonctionnement lui-même avec une 4.2.

Vous devrez ensuite cloner le dépôt Git :

$ git clone https://github.com/Spritetm/esppdp

Puis vous placer dans le répertoire esppdp/firmware pour utiliser la commande idf.py menuconfig afin de choisir le type de carte utilisé. Nous avons le choix entre « Esp32-Wrover-Kit » et « Final dedicated board », via les menus « ESP-PDP11 Configuration », puis « Hardware to run on ». J'ai choisi la seconde option après avoir rapidement parcouru le schéma du montage [2], mis à disposition dans le dépôt Git. Certes, l'ESP32Cam ne dispose pas d'écran LCD, mais les GPIO utilisés n'interfèrent pas avec les composants présents sur le périphérique. Il n'y a donc pas de modification véritablement nécessaire à faire dans le code (mais un « nettoyage » est prévu pour plus tard).

Une fois la configuration validée, il vous suffira de passer l'ESP32Cam en mode programmation (GPIO0 à la masse) et lancer la construction avec un idf.py all, puis le flashage du firmware avec idf.py flash monitor. Ceci aura pour effet de programmer le microcontrôleur et d'enchaîner immédiatement sur le démarrage du moniteur série.

Par défaut, une image d'un support de stockage est directement embarquée en SPIFFS (avec un Tetris en baremetal sur PDP-11). Cependant, pour utiliser le système 2.11BSD, vous devrez préparer une carte microSD. Dans le répertoire hard-disk-image se trouve une archive rq.dsk.zip qui, après désarchivage, devra être copiée sur le support préalablement formaté en FAT32. Lorsque le firmware démarre, il cherche automatiquement le fichier en question, et s'il le trouve, il l'utilisera comme un disque dur pour le PDP-11.

2. Utilisation de 2.11BSD

Directement suite à la programmation de la flash, retirez la connexion de GPIO0 à la masse et utilisez le bouton de reset. Si tout se passe correctement, vous devrez voir une série de messages défiler à l'écran, puis s'arrêter sur :

Attach RA92 disk to RQ
sim_disk_attach(unit=0,filename='/sdcard/rq.dsk') OK
Boot from RQ
Main sim start
 
73Boot from ra(0,0,0) at 0172150
:

C'est l'invite du chargeur du PDP-11 qui attend votre feu vert, appuyez simplement sur « Entrée » et soyez patient. Le boot va alors se poursuivre :

Boot: bootdev=02400 bootcsr=0172150
 
2.11 BSD UNIX #4: Sat Nov 21 16:44:32 PST 2020
    root@esppdp:/usr/src/sys/ESPPDP
 
ra0: Ver 3 mod 3
ra0: RA92 size=2940951
attaching qe0 csr 174440
qe0: DEC DELQA addr 24:6f:28:23:b2:f0
attaching lo0
 
phys mem = 3670016
avail mem = 3335680
user mem = 307200
 
November 22 11:29:59 init: configure system
[...]
erase, kill ^U, intr ^C254 skipped: No autoconfig routines.
#

Cette fois, nous avons une invite de shell UNIX, mais nous sommes en mode mono-utilisateur. C'est une simple phase préliminaire du boot BSD. Là, utilisez la séquence Ctrl+D pour quitter ce mode et laisser init passer dans le runlevel multi-utilisateur :

# Fast boot ... skipping disk checks
checking quotas: done.
Assuming NETWORKING system ...
wifid_parse_packet:
[...]
wifid: signal connected
starting system logger
checking for core dump...
preserving editor files
Nov 22 11:31:54 esppdp vmunix: ra0: Ver 3 mod 3
clearing /tmp
Nov 22 11:31:54 esppdp vmunix: ra0: RA92 size=2940951
standard daemons: update cron accounting.
[...]
 
2.11 BSD UNIX (esppdp) (console)
 
login:

Entrez root, puis esppdp11 en guise de mot de passe et vous voici connecté à votre serveur 2.11BSD. Jeroen Domburg a créé un petit outil permettant de configurer facilement la connexion Wi-Fi. Pour cela, invoquez simplement la commande wifid -connect suivie, en argument, du SSID de votre point d'accès Wi-Fi et du mot de passe associé. Cette configuration perdurera d'un démarrage à l'autre et vous donnera immédiatement une connexion au Net. Chose que vous pouvez vérifier avec :

ifconfig qe0
qe0: flags=63<UP,BROADCAST,NOTRAILERS,RUNNING>
   inet 192.168.0.210 netmask ffffff00 broadcast 192.168.0.255

Ceci signifie que la machine peut accéder à l'extérieur, mais aussi qu'il est possible d'y accéder depuis n'importe quel hôte du réseau. Mais tous les services en route ne permettent pas l'utilisation du compte root. Vous devez donc créer un utilisateur standard (oui, il en existe déjà un mais ce n’est pas amusant). Pour cela, préparez la ligne suivante dans un coin : hackable::102:10::::Hackable magazine:/usr/home/hackable:/bin/sh. Il s'agit d'une entrée classique de /etc/passwd avec, par exemple, hackable comme nom d'utilisateur, 102 comme UID, 10 pour le GID (staff), /usr/home/hackable pour son $HOME et /bin/sh comme shell par défaut.

Connectez-vous en root au système (idéalement en Telnet puisque vous avez l'IP) et spécifiez tout d'abord votre type de terminal (sinon vi râle plus tard) :

# TERM=vt100

Ajoutez ensuite la fameuse ligne à master.passwd (avec un copier-coller) et régénérez la base de mots de passe :

# cd /etc
# cat >> master.passwd
hackable::102:10::::Hackable magazine:/usr/home/hackable:/bin/sh
^D
 
# cp master.passwd passwd
#mkpasswd /etc/passwd

Vérifiez ensuite (c'est important) l'utilisateur créé avec :

# chpass hackable

Ceci lance l'éditeur vi et vous affiche les informations. Il n'y a rien à changer, mais en sauvegardant et en quittant simplement (:wq), l'outil va réinitialiser /etc/passwd et en faire disparaître les mots de passe chiffrés provenant de master.passwd. Nous pouvons alors créer le répertoire personnel de l'utilisateur :

# mkdir /usr/home
# mkdir /usr/home/hackable
# chgrp staff /usr/home/hackable
# chown hackable /usr/home/hackable

Et enfin, si vous voulez que celui-ci puisse utiliser su, ajoutez-le dans le groupe wheel en éditant le fichier /etc/group avec vi. Inutile de connaître les vieilles commandes du Vi original ici, un simple A (majuscule) vous placera au bout de la première ligne, en mode insertion. Ajoutez alors ,hackable, puis enregistrer le fichier avec [Echap], puis :w! (le fichier est en lecture seule). Enfin, quittez avec :q.

Dans un autre terminal, connectez-vous en Telnet et saisissez le nom de l'utilisateur créé :

$ telnet 192.168.0.210
Trying 192.168.0.210...
Connected to 192.168.0.210.
Escape character is '^]'.
 
2.11 BSD UNIX (esppdp)
 
login: hackable

Il n'a pas de mot de passe, vous obtenez directement un shell. Changez alors le mot de passe avec :

$ passwd
Changing password for hackable.
Old password:
New password:
Retype new password:
$

À présent que l'utilisateur existe et possède un mot de passe, vous pouvez vous connecter au serveur FTP pour prendre et déposer des fichiers. Quels fichiers ? Pourquoi pas le binaire d'un programme que vous aurez compilé sur la machine cliente ?

PDPesp32cam-s

Comprenez la magie de la chose : ceci est un PDP-11 simulé, de la taille d'une clé USB, faisant fonctionner un vrai BSD, capable de se connecter au Net, de compiler du code C, multi-utilisateur, multitâche... Comment ne pas être tout simplement émerveillé ?

3. Compiler ses programmes sur PC (ou RPi)

Le 2.11BSD fonctionnant sur le PDP-11 simulé par l'ESP32 dispose d'un compilateur C parfaitement utilisable. Cependant, ceci est d'une lenteur « historique » et quelque chose de très peu ergonomique (vous avez sans doute remarqué que le la console ne réagit pas comme un terminal moderne). Pour développer pour le système et cette machine mythique, nous pouvons cependant construire un compilateur croisé. Nous pourrons alors développer sur une plateforme moderne pour le système cible.

Nous allons devoir construire une chaîne de compilation et, avant toutes choses, nous devons installer dans notre système (Ubuntu, Debian, Raspbian, Devuan, etc.), les paquets nécessaires : libmpc-dev, libmpfr-dev et libgmp-dev. Ceci fait, nous pouvons nous placer dans le sous-répertoire gcc-pdp11/ du dépôt. Jeroen Domburg a déjà fait une partie du travail pour nous, en nous fournissant une Libc pour la plateforme, mais nous devons faire tout le reste.

Nous commençons donc par créer un répertoire crosstool à cet endroit, destiné à accueillir le cross-compilateur. Puis nous récupérons et désarchivons les binutils et GCC :

$ wget https://ftp.gnu.org/gnu/binutils/binutils-2.35.1.tar.gz
$ wget https://ftp.gnu.org/gnu/gcc/gcc-10.2.0/gcc-10.2.0.tar.gz
$ tar xfzv binutils-2.35.1.tar.gz
$ tar xfzv gcc-10.2.0.tar.gz

Nous en profitons pour créer une variable d'environnement avec le répertoire de destination à utiliser :

$ export CROSSDIR=${PWD}/crosstool

Commençons par les binutils :

$ cd binutils-2.35.1
$ ./configure --prefix=$CROSSDIR \
--target=pdp11-aout
$ make -j 12
$ make install

Adaptez la valeur du paramètre -j en fonction de votre processeur. Remarquez que les notes de Jeroen (gcc-pdp11/notes.txt) utilisent une cible pdp11-bsd2.11 qui ne semble pas plaire du tout au GAS (assembleur GNU) des binutils 2.35, et que downgrader à 2.25 soulève des problèmes de formats de binaires par la suite).

Nous passons ensuite à GCC, mais notez qu'il ne faut pas compiler directement dans le répertoire source (ce n'est pas l'usage et également source de problèmes tantôt). Nous créons donc un répertoire pour l'occasion :

$ cd ..
$ mkdir gccbuild
$ cd gccbuild
$ ../gcc-10.2.0/configure --prefix=$CROSSDIR \
--target=pdp11-aout --enable-languages=c \
--disable-libssp
$ make -j 12
$ make install

Nous avons à présent un compilateur fonctionnel dans $CROSSDIR, mais ce n'est pas suffisant. Nous devons ajouter la Libc et les fichiers d’en-tête adéquats. Les libs sont fournies et nous n'avons qu'à les copier :

$ cd ${CROSSDIR}/pdp11-aout
$ tar xfv ../../lib.tar

Puis nous passons aux fichiers en-tête provenant du projet RetroBSD. Les véritables fichiers de 2.11BSD ne sont pas compatibles avec un compilateur récent :

$ cd ../..
$ git clone https://github.com/RetroBSD/retrobsd.git
$ cp -rv retrobsd/include/* \
${CROSSDIR}/lib/gcc/pdp11-aout/10.2.0/include/
$ rm ${CROSSDIR}/lib/gcc/pdp11-aout/10.2.0/include/sys
$ mkdir ${CROSSDIR}/lib/gcc/pdp11-aout/10.2.0/include/sys
$ cp -rv retrobsd/sys/include/* \
${CROSSDIR}/lib/gcc/pdp11-aout/10.2.0/include/sys

Tout est presque prêt mais nous devons d'abord corriger un problème. Le compilateur utilise une LibGCC qui elle-même a besoin de la présence d'une fonction _atexit(), qui n'existe pas dans la Libc d'origine. Nous devons donc corriger le problème en créant une fausse fonction, puis ajouter le fichier objet dans la bibliothèque statique libc.a. Le fichier source (atexit.c) est le suivant :

void atexit() { }
void _atexit() { }

Et nous compilons et installons avec :

$ export PATH="${CROSSDIR}/bin:${PATH}"
 
$ pdp11-aout-gcc -c -o atexit.o atexit.c
$ pdp11-aout-ar qs \
$CROSSDIR/pdp11-aout/lib/libc.a atexit.o

Remarquez que nous commençons tout d'abord par modifier temporairement le chemin de recherche des exécutables ($PATH) pour que le shell trouve le compilateur et ses outils. Nous pouvons maintenant passer à la partie la plus jouissive (oui, et je pèse mes mots) puisque nous allons écrire notre premier code pour le 2.11BSD fonctionnant sur un PDP-11 !

Voici notre source C :

#include <stdio.h>
 
int
main()
{
   printf("Coucou Hackable !\n");
   return 0;
}

Et voici notre Makefile :

PREFIX=pdp11-aout-
CC=$(PREFIX)gcc
CFLAGS=-static -msplit -DPDP
LDLAGS=-Wl,-T${PWD}/link.ld" -static -msplit` \
       -lc -Wl,--allow-multiple-definition
TARGET=hello
OBJS=hello.o
 
all: $(TARGET)
 
$(TARGET): $(OBJS)
        $(CC) $(LDFLAGS) -o $(TARGET) $(OBJS)
 
clean:
        rm -rf $(TARGET) *.o

Notez que nous utilisons prudemment le script pour l'éditeur de liens présent dans esppdp/wifid, les sources de l'outil wifid de configuration de la connexion Wi-Fi, qui devra donc être copié dans le même répertoire. Un simple make permettra de produire le binaire hello qu'il nous suffira de transférer sur la cible (en FTP) et nous donner le plaisir de faire ceci :

$ ./hello
Coucou Hackable !

Et voilà comment on peut développer un code sur un PC GNU/Linux, en 2022 (2023 sans doute quand vous lirez ceci), pour une machine légendaire de plus de 30 ans faisant fonctionner un système non moins mythique, à l'origine de tant de bonnes choses.

4. Pour finir et petite astuce

Il n'y a qu'une conclusion possible à cet article, celle où je tire mon chapeau à monsieur Jeroen Domburg [5], doublé d'une révérence en prime, car le travail accompli est tout bonnement merveilleux. Visitez son site, il est plein de projets du même acabit, tout simplement bluffant (comme sa décoration pour sapin de Noël, permettant de jouer à Doom [6]).

Si vous voulez vous faire plaisir avec un PDP-11 mais n'avez pas d'ESP32 adapté sous la main, vous pouvez également utiliser SIMH sur différentes plateformes et une image disque 2.11BSD est disponible sur le dépôt GitHub de « Eunuchs » [7] à cet effet.

Et je finirai simplement avec une petite astuce, si vous voulez transférer « facilement » des binaires sans liaison d'aucune sorte avec votre hôte 2.11BSD :

$ uuencode hello hello > hello.uu
$ cat hello.uu
<copier à la souris>
 
# cat > hello.uu
<coller>
^D
 
# uudecode hello.uu
# chmod +x hello

Références

[1] https://github.com/simh/simh

[2] https://spritesmods.com/minipdp11/esppdp-schematic.pdf

[3] https://connect.ed-diamond.com/Hackable/hk-033

[4] https://connect.ed-diamond.com/Hackable/hk-034/developpement-esp32-avec-le-nouveau-esp-idf-4.0

[5] https://spritesmods.com/

[6] https://www.youtube.com/watch?v=u9ODhV40aEI

[7] https://github.com/eunuchs/unix-archive/tree/master/PDP-11/Boot_Images/2.11_on_Simh



Article rédigé par

Par le(s) même(s) auteur(s)

Chroot n'est pas mort, il va d'ailleurs très bien... sous OpenBSD

Magazine
Marque
GNU/Linux Magazine
Numéro
273
Mois de parution
janvier 2025
Spécialité(s)
Résumé

Dans un précédent article [1], nous avons exploré la possibilité de créer des machines virtuelles « vierges » dans le but de tester des ports OpenBSD en cours de développement, en particulier pour nous assurer que les dépendances étaient correctement décrites et complètes. Tout ceci était motivé par le fait de devoir jongler entre différentes versions du système (current versus release ou stable). Si cette contrainte n'est pas là, les choses deviennent beaucoup plus simples à gérer et les VM peuvent être remplacées par quelque chose de bien plus léger : un simple environnement chrooté.

Mettre en place une surveillance domotique avec Raspberry Pi

Magazine
Marque
Hackable
Numéro
58
Mois de parution
janvier 2025
Spécialité(s)
Résumé

Lorsqu'on parle de domotique, on pense généralement aux capteurs et aux automatisations permettant de gérer facilement son habitation pour piloter son chauffage, simuler une présence, faire des économies d'énergie ou tout simplement améliorer son confort en se débarrassant des tâches fastidieuses et répétitives. Cependant, la sécurité est également un point important, qu'on soit sur place ou à distance, et dans ce cas précis, rien de tel que de mettre en place une vidéosurveillance.

Les derniers articles Premiums

Les derniers articles Premium

PostgreSQL au centre de votre SI avec PostgREST

Magazine
Marque
Contenu Premium
Spécialité(s)
Résumé

Dans un système d’information, il devient de plus en plus important d’avoir la possibilité d’échanger des données entre applications. Ce passage au stade de l’interopérabilité est généralement confié à des services web autorisant la mise en œuvre d’un couplage faible entre composants. C’est justement ce que permet de faire PostgREST pour les bases de données PostgreSQL.

La place de l’Intelligence Artificielle dans les entreprises

Magazine
Marque
Contenu Premium
Spécialité(s)
Résumé

L’intelligence artificielle est en train de redéfinir le paysage professionnel. De l’automatisation des tâches répétitives à la cybersécurité, en passant par l’analyse des données, l’IA s’immisce dans tous les aspects de l’entreprise moderne. Toutefois, cette révolution technologique soulève des questions éthiques et sociétales, notamment sur l’avenir des emplois. Cet article se penche sur l’évolution de l’IA, ses applications variées, et les enjeux qu’elle engendre dans le monde du travail.

Petit guide d’outils open source pour le télétravail

Magazine
Marque
Contenu Premium
Spécialité(s)
Résumé

Ah le Covid ! Si en cette période de nombreux cas resurgissent, ce n’est rien comparé aux vagues que nous avons connues en 2020 et 2021. Ce fléau a contraint une large partie de la population à faire ce que tout le monde connaît sous le nom de télétravail. Nous avons dû changer nos habitudes et avons dû apprendre à utiliser de nombreux outils collaboratifs, de visioconférence, etc., dont tout le monde n’était pas habitué. Dans cet article, nous passons en revue quelques outils open source utiles pour le travail à la maison. En effet, pour les adeptes du costume en haut et du pyjama en bas, la communauté open source s’est démenée pour proposer des alternatives aux outils propriétaires et payants.

Sécurisez vos applications web : comment Symfony vous protège des menaces courantes

Magazine
Marque
Contenu Premium
Spécialité(s)
Résumé

Les frameworks tels que Symfony ont bouleversé le développement web en apportant une structure solide et des outils performants. Malgré ces qualités, nous pouvons découvrir d’innombrables vulnérabilités. Cet article met le doigt sur les failles de sécurité les plus fréquentes qui affectent même les environnements les plus robustes. De l’injection de requêtes à distance à l’exécution de scripts malveillants, découvrez comment ces failles peuvent mettre en péril vos applications et, surtout, comment vous en prémunir.

Les listes de lecture

7 article(s) - ajoutée le 01/07/2020
La SDR permet désormais de toucher du doigt un domaine qui était jusqu'alors inaccessible : la réception et l'interprétation de signaux venus de l'espace. Découvrez ici différentes techniques utilisables, de la plus simple à la plus avancée...
8 article(s) - ajoutée le 01/07/2020
Au-delà de l'aspect nostalgique, le rétrocomputing est l'opportunité unique de renouer avec les concepts de base dans leur plus simple expression. Vous trouverez ici quelques-unes des technologies qui ont fait de l'informatique ce qu'elle est aujourd'hui.
9 article(s) - ajoutée le 01/07/2020
S'initier à la SDR est une activité financièrement très accessible, mais devant l'offre matérielle il est parfois difficile de faire ses premiers pas. Découvrez ici les options à votre disposition et les bases pour aborder cette thématique sereinement.
Voir les 33 listes de lecture

Abonnez-vous maintenant

et profitez de tous les contenus en illimité

Je découvre les offres

Déjà abonné ? Connectez-vous