Constatant que les Raspberry Pi étaient de plus en plus utilisés dans des environnements industriels et embarqués (IoT), le projet Xen, organisation derrière l’hyperviseur éponyme a décidé d’en assurer le portage sur les cartes-mères. Georges Dunlap, président du conseil consultatif du projet Xen, a été convaincu de ce portage par les derniers chiffres de ventes divulgués par la Fondation Raspberry Pi, 30 millions d’unités vendues à la fin 2019 et plus de 600 000 exemplaires en avril 2020.

Il a donc chargé Stefano Stabellini, qui travaille chez Xilinx, fabricant de FPGA, et Roman Shaposhnik, ancien directeur de la Fondation Apache, d'assurer ce portage. Les deux spécialistes ont constaté que le SoC du Raspberry Pi 4 utilisait un contrôleur d’arrêt GIC-400 classique qui prend en charge Xen. Ils étaient donc optimistes en prévoyant un travail facile de portage. C’était sans compter sur le monde complexe des adresses mémoires virtuelles et physiques. 

Une succession d’obstacles

Nos confrères de The Register rapportent que le duo aurait été « totalement inconscient en s’embarquant dans une aventure au fin fond du ventre de l’allocateur mémoire Xen et des couches de traduction d’adresses Linux ». Dans un blog, ils ont détaillé leurs aventures en indiquant que « le premier obstacle était la disponibilité d’adresses à faible mémoire ». Un contributeur au projet Xen, Julien Grall, a résolu le problème d’allocation de mémoire.

Mais le problème d’adressage n’était toujours par résolu. « Le sous-système Xen de Linux utilise virt_to_phys pour convertir les adresses virtuelles en adresses physiques, ce qui fonctionne pour la plupart des adresses virtuelles mais pas toutes. Il s'avère que le noyau Linux RPi4 transmet parfois des adresses virtuelles qui ne peuvent pas être converties en adresses physiques à l'aide de virt_to_phys, ce qui entraîne de graves erreurs », précisent les deux contributeurs. Ils ont trouvé une solution en utilisant une fonction de traduction d'adresse différente quand c’est nécessaire.

Une douzaine de patch nécessaires

« Allocation mémoire ok, conversation des adresses ok. C’est tout bon pour y aller », s’écrient les deux experts dans le blog. Eh bien non, il restait un dernier obstacle et non des moindres. « Le noyau Linux a toujours eu le concept d'adresses physiques et d'adresses DMA, où les adresses DMA sont utilisées pour programmer les périphériques et peuvent être différentes des adresses physiques », observent-ils. Ils ajoutent qu'en pratique, « aucune des plates-formes x86, ARM et ARM64 sur lesquelles Xen tourne n'a d'adresses DMA différentes des adresses physiques. Mais le sous-système Xen dans Linux utilise cette dualité pour sa propre traduction d’adresses ». Or « le Raspberry Pi 4 est la première plateforme à avoir des adresses physiques différentes des adresses DMA et cela faisait planter Xen ».

Pour résoudre le problème, pas moins d’une douzaine de patchs ont été nécessaires. Pour avoir le portage complet, il faudra attendre la finalisation de Linux 5.9. Cette dernière version doit encore faire l’objet de test, a indiqué Linus Torvalds. Pour ceux qui ne peuvent pas attendre, le projet EVE a mis en place une page GitHub pour porter Xen sur Raspberry Pi.