Door Koen Vervloesem

Freelanceredacteur

Kan Zephyr succes Linux evenaren?

Modulair OS voor iot-apparaten

03-02-2022 • 06:00

37

Singlepage-opmaak

Belgische herkomst, focus op kwaliteit en veiligheid

Geschiedenis van Zephyr

De geschiedenis van Zephyr begon bij Eonic Systems. Dit Belgische softwarebedrijf ontwikkelde in 1991 een realtime besturingssysteem voor digitale signaalprocessoren (dsp’s), Virtuoso. In 2001 werd Eonic Systems overgenomen door Wind River Systems. Virtuoso werd in die tijd onder andere ingezet in de Rosetta-ruimtesonde van ESA.

Wind River Systems werd op zijn beurt in 2009 overgenomen door Intel. Daarna werd Virtuoso geport naar de x86-architectuur, en later ook naar Arm. In 2015 werd het besturingssysteem hernoemd naar Rocket en werd het project opensource gemaakt. Het kreeg zo een nieuwe bestemming als mini-besturingssysteem voor slimme sensoren. De kleinste versie van Rocket draaide zelfs op 32-bit-microcontrollers met maar 4KB geheugen.

In 2016 doneerde Wind River Systems zijn Rocket-kernel aan een nieuw project van de Linux Foundation, Zephyr. Andere deelnemers vanaf het begin waren Intel, NXP Semiconductors, Synopsys en UbiquiOS Technology. Ook Linaro, Texas Instruments en Nordic Semiconductor waren vroege supporters.

De originele Rocket-kernel, die uit een nanokernel en een microkernel bestond, werd in Zephyr 1.6 (in december 2016) vervangen door één monolithische kernel, die eenvoudiger was om op te programmeren.

Long-term support

De ontwikkelaars van Zephyr hebben heel wat van het ontwikkelmodel van Linux overgenomen. Zo zijn er ook lts-versies (long-term support). Dit zijn versies die langere tijd onderhouden worden, zodat bedrijven een stabiele basis hebben om op voort te bouwen voor hun producten. In het geval van Zephyr lts-releases is de ondersteuningstermijn minstens twee jaar. Een lts-release krijgt geen nieuwe functies of substantiële verbeteringen, maar wel oplossingen voor ernstige of beveiligingsgerelateerde fouten.

De eerste lts-release was Zephyr 1.14 uit april 2019, met 160 ondersteunde bordconfiguraties voor acht architecturen. Hij werd in oktober 2021 gevolgd door de tweede lts-versie, Zephyr 2.7. Die ondersteunt maar liefst vierhonderd bordconfiguraties voor twaalf architecturen.

Zephyr boards
Zephyr ondersteunt meer dan 400 ontwikkelbordjes van 12 architecturen

Kwaliteit en veiligheid

In 2019 was Zephyr een van de drie opensourceprojecten die de ‘gouden’ badge voor Best Practices van het Core Infrastructure Initiative ontvingen. Inmiddels hebben achttien projecten deze status en Zephyr heeft nog altijd de maximale score. Hiermee toont het project aan dat het goede ontwikkelpraktijken hanteert met een focus op kwaliteit en veiligheid.

De Zephyr-ontwikkelaars hebben diverse werkgroepen, en een daarvan is de Security Working Group. Deze handelt niet alleen gevonden kwetsbaarheden af, maar werkt ook aan een veilige architectuur voor het besturingssysteem. In de documentatie van Zephyr staat uitgebreid beschreven welke maatregelen de ontwikkelaars nemen op het gebied van veiligheid.

Zephyr Opensff
Zephyr haalt de maximale score van de OpenSSF Best Practices voor kwaliteit en veiligheid.

Buildsysteem

Zephyrs buildsysteem is gebaseerd op CMake. Elke Zephyr-applicatie heeft een bestand CMakeLists.txt dat het buildsysteem vertelt waar het de benodigde codebestanden vindt en hoe de applicatie met Zephyr gelinkt wordt.

Je kunt CMake rechtstreeks aanroepen om je applicatie te compileren, maar de standaard buildtool van Zephyr is west, dat dan op de achtergrond CMake aanroept. De Zephyr-ontwikkelaars beschrijven west als een ‘meta-tool’. Met west compileer je niet alleen je applicatie, maar flash je hem ook naar je apparaat en kun je ook repository’s beheren.

De ontwikkelomgeving van Zephyr draait zowel op Windows als macOS en Linux (Ubuntu is de ondersteunde distributie). Je installeert hiermee de compiler, assembler, linker en alle andere benodigde programma’s om Zephyr-applicaties te bouwen.

Modulaire opbouw

Zephyr is modulair opgebouwd. De applicatie die je ontwikkelt, wordt samen met Zephyr en eventuele externe bibliotheken gecompileerd en statisch gelinkt tot één stuk firmware dat je naar je apparaat flasht. Bij het compileren geef je aan welke subsystemen je al dan niet nodig hebt en in de firmware wilt opnemen. Op die manier kan Zephyr ook op apparaten met een breed bereik van mogelijkheden draaien, van de kleinste chips met 8KB ram tot ontwikkelbordjes waarop je zelfs Linux kunt draaien.

Voor je keuze van subsystemen die je gebruikt - en andere configuratie-opties - maakt Zephyr gebruik van Kconfig, het configuratiesysteem van de Linux-kernel. Je schakelt hiermee niet alleen subsystemen in en uit (zoals bluetooth, IPv6, LwM2M, I²C, …), maar configureert ze ook tot in de details. Ook architectuurspecifieke opties, drivers en allerlei softwarebibliotheken configureer je op deze manier.

De configuratie-opties voor je applicatie stel je in een bestand prj.conf in. Dat ziet er voor een bluetooth-sensorbordje bijvoorbeeld als volgt uit:

CONFIG_BT=y
CONFIG_I2C=y
CONFIG_SENSOR=y
CONFIG_BME280=y

Hiermee schakel je de subsystemen voor bluetooth, I²C en sensoren in, evenals de driver voor de BME280-sensor die temperatuur, luchtdruk en luchtvochtigheid meet. Overigens schakelt het buildsysteem afhankelijk van het bordje waarvoor je je applicatie bouwt, op de achtergrond allerlei andere opties al standaard in.

Je kunt je configuratie ook opsplitsen in meerdere bestanden. Zo kent Zephyr het concept van een overlay config-file. In dit bestand zet je extra configuratie-opties die je in specifieke omstandigheden aan het standaardbestand prj.conf wilt toevoegen, bijvoorbeeld om een debugversie van de firmware te bouwen. Overlayconfiguratiebestanden voeg je toe met de CMake-variabele OVERLAY_CONFIG.

Het exacte configuratiebestand waarmee je toepassing wordt gebouwd, na het toepassen van de expliciet opgegeven configuratiebestanden en overlays en de standaardconfiguratie voor het gekozen bordje, vind je na het bouwen in het bestand zephyr/build/zephyr/.config.