Micro-kernels have been receiving renewed attention during recent years. After being discarded in the mid 1990s on the grounds of causing too much performance impact, the approach seems to be the answer to today´s computer problems: Today, computers generally do not suffer from lack of performance, but they often have severe reliability problems.
Reliability and performance are especially relevant in the field of embedded systems: While the modern PC user may have come to accept the occasional system crash as a fact of life, crashing cellular phones or video recorders are embarrassing for their manufacturers and a potential cause for loss of reputation and market share. More critically though, a malfunction in an electronic control unit of many devices, such as a car or an airplane, can be a severe threat to the life and property of humans.
Reduce Software Complexity
Software complexity is the core problem here and microkernels offer the possibility to tackle it with a "divide and conquer" approach: a microkernel only provides basic functionality which can be used to divide the system´s resources (memory, I/O devices, CPU time) into separate subsets. Each of these subsets, which we will further refer to as partitions, can be regarded as a virtual machine and as such it can host an operating system along with its world of application programs.
Separate Functionality through Partitioning
Since partitions operate on separate sets of resources, they are completely isolated and there is no way for a program in one partition to affect another partition. In this way, multiple "guest" operating systems are able to coexist in a single machine and their individual functionalities can be tailored to match the requirements of their application programs. Thus, applications are no longer forced to unconditionally trust a huge monolithic kernel containing a lot of complex functionalities that the application may or may not need. Instead, each subsystem can choose the amount of code that it wants to trust: It can trade complexity for trust.
Serve All Timing Needs
In complex embedded systems, there frequently exist applications with very different temporal requirements: some must guarantee timely service under all circumstances while others have no such constraint, but are instead expected to work "as fast as possible" by making best use of all resources they can possibly obtain. The differences between such real-time and non-real-time programs are reflected in the functionalities they need their underlying operating system to provide: There are distinct real-time and non-realtime operating system functions. This presents a problem in monolithic systems because there exists only one operating system interface which has to incorporate all the real-time and non-real-time functionalities.
Safe Combination of Real-Time and Non Real-Time
In contrast, a microkernel can host multiple operating systems, so it is possible to have distinct real-time or non-real-time interfaces coexisting in separate partitions of a single machine. However, in such a scenario the microkernel must guarantee timely availability of sufficient computational resources to its real-time guests so they can in turn fulfill their requirements. Not all microkernels are equally suitable in this respect.