Microkernel: een besturingssysteem dat zoveel mogelijk aan anderen overlaat
Elke computer heeft een kernel: het stukje software dat als eerste contact maakt met de hardware en dat bepaalt wie welk geheugen mag gebruiken, welk proces wanneer de processor krijgt en hoe programma's met elkaar en met schijven, netwerkkaarten en schermen praten. Een microkernel is een ontwerpkeuze waarbij dat kernstuk zo klein mogelijk wordt gehouden. Alleen de absolute basis - berichten doorgeven tussen programma's, een beetje geheugenbeheer en de planning van processen - draait in de beveiligde kernmodus. Vrijwel alles wat een besturingssysteem normaal ook doet, zoals bestandssystemen, netwerkverkeer afhandelen of printers aansturen, wordt verplaatst naar gewone, afgeschermde programma's buiten de kern.
Vergelijk het met een postkamer in een groot kantoorgebouw. Een microkernel is als een postkamer die uitsluitend brieven aflevert bij de juiste afdeling, zonder zelf te weten of mee te beslissen wat er in die brieven staat. De boekhouding, de juridische afdeling en de IT-helpdesk werken allemaal in hun eigen afgesloten kamer en kunnen niet zomaar bij elkaars dossiers. Gaat de boekhouding in de fout, dan kan die afdeling worden afgesloten en vervangen zonder dat de rest van het gebouw stilvalt. Bij een traditioneel besturingssysteem - een monolithische kernel, zoals de kern van Linux of Windows - zitten al die afdelingen juist in dezelfde grote, open ruimte met toegang tot alles. Dat is vaak sneller, maar een fout op één plek kan dan het hele gebouw platleggen.
Wat is het precies?
Een besturingssysteem bestaat uit lagen. Onderaan ligt de hardware: processor, geheugen, schijven, netwerkkaart. Daarboven zit de kernel, die in een beschermde modus draait waarin hij volledige controle heeft over de hardware. Daarboven draaien de gewone programma's, die via de kernel om toegang tot hardware moeten vragen.
Bij een monolithische kernel zitten bestandssystemen, netwerkstacks, grafische stuurprogramma's (drivers) en nog veel meer allemaal samen in die beschermde kernmodus, als één groot stuk code dat elkaar volledig vertrouwt. Dat is efficiënt, omdat onderdelen direct bij elkaars geheugen kunnen en geen tussenstappen nodig zijn. Het risico is dat een fout in, bijvoorbeeld, een videodriver de hele machine kan laten crashen, omdat die driver dezelfde rechten heeft als de kernel zelf.
Een microkernel haalt bijna al die onderdelen uit de beschermde kernmodus en maakt er losse, gewone programma's van - vaak 'servers' genoemd - die net als elke andere applicatie in een afgeschermd geheugengebied draaien. Wil een tekstverwerker iets op schijf opslaan, dan stuurt die een berichtje naar de bestandssysteem-server, die weer een berichtje stuurt naar de schijf-driver-server, enzovoort. Die berichten lopen via een mechanisme dat inter-process communication (IPC) heet, en dat is zo ongeveer de enige taak die de microkernel zelf nog met autoriteit uitvoert, naast basale geheugentoewijzing en het plannen van welk proces wanneer de processor krijgt.
Het voordeel is isolatie: crasht de bestandssysteem-server, dan kan de kernel die server herstarten zonder dat de rest van het systeem meegesleurd wordt. Het nadeel is snelheid: al dat heen-en-weer sturen van berichtjes tussen afgeschermde geheugengebieden kost meer rekentijd dan wanneer alles gewoon rechtstreeks bij elkaar kan. Dat spanningsveld - veiligheid en stabiliteit tegenover snelheid - is het centrale thema van de hele microkernel-geschiedenis.
Wat wil men ermee bereiken?
Het eerste doel is betrouwbaarheid. Als een stuurprogramma voor een netwerkkaart crasht in een monolithische kernel, kan dat de hele computer laten vastlopen. In een microkernel-ontwerp is zo'n driver maar een gewoon, geïsoleerd programma: crasht het, dan start het systeem alleen die ene server opnieuw op, terwijl de rest doorwerkt.
Het tweede doel is veiligheid. Kleinere code is makkelijker te controleren op fouten. Een microkernel bestaat vaak uit maar enkele duizenden tot tienduizenden regels code, tegenover tientallen miljoenen regels in de kern en bijbehorende drivers van een modern monolithisch systeem. Minder code in de meest bevoorrechte modus betekent minder plekken waar een beveiligingslek de hele machine kan overnemen - een toepassing van het zogeheten least privilege-principe: elk onderdeel krijgt alleen de rechten die het strikt nodig heeft.
Een derde, meer wiskundig doel is formele verificatie: het bewijzen, met logische stellingen in plaats van alleen testen, dat de code precies doet wat hij moet doen en niets anders. Dat is alleen haalbaar bij kleine, overzichtelijke codebases, en is daarom vrijwel ondenkbaar voor een complete monolithische kernel, maar wel voor een microkernel van beperkte omvang.
Daarnaast spelen modulariteit en voorspelbaarheid een rol: onderdelen kunnen afzonderlijk worden bijgewerkt of vervangen, en in tijdkritische toepassingen - een auto-airbag, een beademingsapparaat, een vliegtuigsysteem - is voorspelbaar, gegarandeerd tijdig reageren vaak belangrijker dan maximale snelheid.
Voorbeelden uit de praktijk
QNX, oorspronkelijk ontwikkeld door het Canadese QNX Software Systems en sinds 2010 onderdeel van BlackBerry, is een van de langst lopende commerciële microkernels. Het draait al decennia in miljoenen auto's als besturingssysteem onder het dashboardscherm en instrumentenpaneel, en in medische apparatuur en industriële besturingen, precies omdat het voorspelbaar en storingsbestendig moet zijn.
MINIX 3, de modernere opvolger van het door Andrew Tanenbaum aan de Vrije Universiteit Amsterdam ontwikkelde onderwijssysteem MINIX uit 1987, kreeg onverwachte bekendheid toen rond 2017 bleek dat Intel's Management Engine - een apart, verborgen beheerprocessortje dat in vrijwel elke moderne Intel-chip zit - intern op een variant van MINIX 3 draait.
seL4, ontstaan bij het Australische onderzoeksinstituut NICTA, was in 2009 de eerste microkernel waarvan onderzoekers wiskundig bewezen dat de implementatie overeenkomt met de specificatie. Binnen het Amerikaanse defensie-onderzoeksprogramma HACMS (High-Assurance Cyber Military Systems) van DARPA werd seL4 gebruikt om een onbemande Boeing-helikopter te beschermen tegen een team aanvallers, die er - ondanks volledige toegang tot de broncode - niet in slaagden het systeem over te nemen.
De L4-familie van microkernels, die teruggaat op het werk van Jochen Liedtke in de jaren negentig en verder is ontwikkeld aan de TU Dresden en het bedrijf Kernkonzept, draait in een afgeschermde vorm op de modemchips (de baseband-processor) van een groot deel van de smartphones wereldwijd, los van het hoofdbesturingssysteem van de telefoon.
Fuchsia, het besturingssysteem dat Google rond 2016 begon te ontwikkelen op basis van de microkernel Zircon, werd in 2021 als eerste praktijktest uitgerold op de eerste generatie Nest Hub-slimme schermen, ter vervanging van het eerdere, op Linux gebaseerde systeem.
Hoe ver is de techniek?
In gespecialiseerde niches is de microkernel allang geen experiment meer: in de auto-industrie, de luchtvaart, defensie en medische apparatuur draaien dit soort systemen al decennia betrouwbaar. Op dat vlak is de techniek volwassen.
Op het gebied van gewone pc's, laptops en servers is het verhaal anders. Begin jaren negentig voerden Andrew Tanenbaum en Linus Torvalds een beroemd geworden discussie, destijds op Usenet, over de vraag of een microkernel-aanpak niet de betere toekomst was dan Torvalds' monolithische Linux-kernel. De geschiedenis gaf Linux de overhand in de praktijk: Linux werd dominant, terwijl het microkernel-gebaseerde GNU Hurd-project, dat al in 1990 werd aangekondigd, decennia later nog altijd niet geschikt is voor algemeen gebruik.
De belangrijkste belemmering is en blijft snelheid: het voortdurend doorgeven van berichten tussen geïsoleerde geheugengebieden kost rekentijd die een monolithisch systeem niet kwijt is. Snellere hardware en slimmere IPC-technieken hebben dat verschil kleiner gemaakt, maar niet weggenomen. Veel bestaande besturingssystemen kozen daarom voor een tussenweg: zogeheten hybride kernels, zoals die van Windows NT en de Mach-geïnspireerde kern van macOS (XNU), nemen wel elementen van het microkernel-ontwerp over maar houden belangrijke onderdelen toch in de kernmodus voor snelheid.
De belangrijkste recente mijlpaal is de opmars van formeel verifieerbare microkernels als seL4, die niet meer alleen een academisch experiment zijn maar daadwerkelijk worden ingezet in veiligheidskritische systemen. Of een microkernel ooit de standaard wordt voor gewone consumentenapparaten, zoals Google met Fuchsia lijkt te onderzoeken, is nog volstrekt onzeker.
Wie werken eraan?
BlackBerry QNX (Canada) blijft de belangrijkste commerciële partij in de auto- en embedded industrie. De seL4 Foundation, sinds 2020 onderdeel van de Linux Foundation en voortgekomen uit onderzoek van NICTA en het Australische CSIRO Data61 in samenwerking met de University of New South Wales, beheert de ontwikkeling van seL4. In Duitsland zet de Technische Universität Dresden al langer onderzoek naar L4-achtige microkernels voort, gecommercialiseerd door het spin-off-bedrijf Kernkonzept, terwijl Genode Labs een open-source raamwerk bouwt om complete, veilige systemen op diverse microkernels (waaronder seL4) te maken. Google ontwikkelt met Fuchsia en de Zircon-kernel een eigen microkernel-gebaseerd platform. Het Amerikaanse defensie-onderzoeksbureau DARPA financierde met het HACMS-programma belangrijk toepassingsonderzoek naar microkernels in militaire en autonome systemen. Academisch blijft de Vrije Universiteit Amsterdam, waar Andrew Tanenbaum nog altijd aan MINIX werkt, een belangrijke bakermat van het vakgebied.