That infamous discussion between Tanenbaum and Linus, is a funny-regrettable moment in the computer history.
To me, a particularly revealing exchange concerned MINIX’s portability. Tanenbaum argued that Linux was excessively dependent on the Intel 80386 and that tying an operating system to one processor architecture was a questionable design decision.
Torvalds responded by questioning the price MINIX paid for its portability. He argued that supporting older machines had prevented MINIX from taking full advantage of capabilities available on newer processors, notably paging.
“Yes, Minix is portable, but you can rewrite that as ‘doesn’t use any hardware features’, and still be right.”
Well, although the way it was phrased is aggressive, let’s talk about technique.
Early microkernels, particularly systems influenced by Mach, had acquired a reputation for substantial communication overhead and relatively expensive transitions between user and kernel space.
In 1995, the prominent Jochen Liedtke approached the microkernel problem from a different direction. Liedtke questioned whether these costs were inherent properties of microkernel architecture or consequences of particular design and implementation decisions.
His conclusion was that much of the inefficiency attributed to microkernels resulted from excessive kernel functionality and unsuitable implementations.
A microkernel should contain only those mechanisms that cannot reasonably be implemented outside it.
Equally important, however, was how those mechanisms were implemented.
Liedtke argued that microkernels are inherently architecture-dependent, even though microkernel-based systems can improve the portability of the operating system as a whole.
This is the remarkable point.
Liedtke’s microkernel could remain minimal, modular, and supportive of portable higher-level services while making aggressive use of processor-specific mechanisms.
Efficient interprocess communication, address-space switching, protection, and exception handling required detailed knowledge of the machine. There was no reason to avoid that knowledge. The kernel was not supposed to ignore the processor. It was supposed to provide a carefully designed extension of its capabilities.
A kernel should exploit the hardware it runs on. Portability of the operating system does not require portability of the kernel’s internal implementation.
And the underlying architectural idea was older than either Linux or MINIX. P.B. Hansen’s RC4000 said it all. 30+ years before.
Beastie Boys sang ‘I’ve been learning from the elders, now it is time to speak’.
Because of that maybe one would say Linus was ‘right’ and Prof Tanenbaum wrong. I am not.
The two developments challenged different assumptions.
- Torvalds rejected the notion that portability should prevent an operating system from taking advantage of the processor.
- Liedtke rejected the notion that modular operating system architecture required accepting the overheads of existing microkernel implementations
Both recognised the importance of exploiting the architecture of the machine.*
They would not find a consensus about where operating system functionality should reside.
Liedtke’s work did not establish that monolithic kernels were architecturally preferable. It found causes for what many regarded as their principal practical disadvantage. Ironically, it reinforced Linus’s argument. Unsurprisingly, it kept Tanenbaum’s architectural milestones.
Refs:
The RC4000 multiprogramming software (1969)
*(Meanwhile, we working with tiny CPUs are pushed to ‘ignore’ the hardware… don’t believe the hype.)

Leave a Reply