DiscoBSD est un portage de 2.11BSD 1 vers des microcontrôleurs 32 bits modernes. Il s’agit en fait d’un fork de RetroBSD qui avait déjà porté 2.11BSD vers PIC32 (MIPS).
Cette distribution apporte le support de ARM Cortex M4, principalement pour les cartes Disco(very) et Nucleo de chez ST. Les modèles supportés sont:
Leur intérêt vient de leur prix nettement plus abordable que leurs équivalents MIPS. Elles intègrent, en plus, leur programmeur ST-Link: il suffit d’un câble USB pour les flasher. Comme j’ai déjà une STM32F4-discovery, c’était trop tentant d’essayer le dernier représentant de la branche 2 de BSD Unix. Pour info, la STM32F4-discovery est équipée de :
- CPU STM32F407VGT6 – Cortex M4 @168MHz
- 192 ko de RAM 2
- 1 Mo de flash
Les mains dans le cambouis
Coté matos, à part un adaptateur UART vers usb pour accéder à la console série, vous aurez besoin d’un lecteur de carte SD compatible Arduino. La connexion du lecteur est décrite plus bas.
Bien sûr, on ne met pas un système d’exploitation complet de type UNIX dans les 1024ko de la mémoire d’un micro-contrôleur: seul, le noyau est « flashé » sur la carte.
Ici pas de bootloader, on exécute directement le noyau au démarrage. Notez que la taille du noyau fait moins de 100ko: avec 1Mo de flash, on a de la marge.
Toute la partie « userland » est contenue sur une carte mémoire au format UFS (L’image fait environ 200 Mo et inclus /
, /home
et la swap de 2Mo). Avec si peu de RAM (192 ko), l’OS utilise la swap pour tous les processus. Faudra pas s’attendre a des perfs de dingue. Mais avec seulement 100Mo d’espace disque, l’OS est livré complet avec le man
, les jeux, et le compilateur C.
Construction depuis FreeBSD
Le projet ne prend en compte, pour la construction, que Linux ou OpenBSD (Pas sûr que ça compile « out of the box »). Pour le compiler sous FreeBSD, vous devrez installer les paquets suivants:
fusefs-libs gcc-arm-embedded gmake st-link git-lite
Récupérez le dépôt
git clone --branch lhondareyte-dev https://github.com/lhondareyte/discobsd.git
Construisez le « userland » et les tools
:
export PATH=$PATH:/usr/local/gcc-arm-embedded/bin cd discobsd gmake
Flashez la carte SD:
dd if=discobsd/distrib/stm32/sdcard.img of=/dev/da0 bs=64k
Compilez le noyau (aka neuyo):
cd discobsd/sys/stm32/f4discovery export PATH=$PATH:/usr/local/gcc-arm-embedded/bin gmake arm-none-eabi-objcopy -O binary -S unix.elf vmunix.bin
Connectez la carte à un port USB et flashez le noyau:
st-flash erase st-flash write vmunix.bin 0x8000000
La console série est associée à l’UART2 (broches PA2 et PA3, respectivement TX et RX). Avec l’adaptateur USB/UART, connectez vous sur la console:
cu -l /dev/cuaU0 -s 115200
Et voilà un démarrage qui échoue lamentablement en panic (le lecteur de carte mémoire n’est pas connecté):
Pas de u-boot ou autre GRUB, pour nous aider. Le ‘disque dur’ doit être accessible.
Connexion du « stockage »
Le lecteur de carte SD est connecté au port SPI2 de la carte. Le protocole SPI utilise 3 signaux (MISO, MOSI et SCK). Connectez comme suit (voir sys/stm32/stm32f4xx_nucleo_sd.h
):
Lecteur STM4_Discovery ------------------------------- CS <------------ PB12 SCK <------------ PB13 MISO ------------> PB14 MOSI <------------ PB15 GND ------------> GND VCC <------------ 3.3V ou 5V (voir article)
Attention à la tension d'alimentation, elle doit correspondre a votre module: s'il possède un régulateur 3.3V (Type AMS1117), connectez le au 5V sinon au 3V de la carte. Au besoin, vérifiez la tension d'alimentation en entrée de l'adaptateur (ou en sortie du régulateur si présent).
Après connexion du lecteur, ça donne ça:
Prenez soin d'effectuer un shutdown
pour arrêter l'OS sous peine de devoir exécuter à nouveau fsck
au boot suivant.
PS : Si vous n'avez pas de carte STM32F4 ou PIC32, vous pouvez toujours simuler 2.11BSD sur PDP11 avec SIMH.
Pour la route...
Liens
- DiscoBSD, le dépôt originel.
- RetroBSD, portage de 2.11BSD sur PIC32.
- LiteBSD, portage de 4.4BSD sur PIC32 avec support de la MMU
- Distribution precompilée disponible localement, noyau
unix.bin
+ image disque
Notes
1 : 2.11BSD, dont les derniers patchs datent de 1991, est la dernière version d'UNIX BSD disponible pour PDP11. ↑
2 : Bill avait raison: 640 ko, ça devrait être suffisant pour n'importe qui. ↑