Questions answered in this FAQ
General µ-kernel-related questions
Questions about Fiasco
Questions and Answers
There are so many kernels already... Why on earth
are you writing another kernel?
- The DROPS
project is based on L4, so we need an L4-compatible µ-kernel.
However, L4/x86 has some shortcomings which make it unsuitable
as a base in the long term (non-availability, not easily
maintainable); so we're developing a compatible replacement.
Retargeting DROPS to a different kernel would be more work than
just writing a new L4-compatible kernel.
What is a µ-kernel?
- A µ-kernel, or microkernel, is an operating system kernel which
provides only essential services such as tasks, threads,
inter-process communication (IPC), and memory management
primitives. All servers -- including device drivers -- run in
user mode and are treated by the µ-kernel just like any other
application. Since each server runs in its own address space,
all these objects are protected from each other.
This design has a number of sofware-technological
- Servers for different APIs, file systems, and even
different operating system personalities can coexist in
- The system is very flexible. For a given application,
only selected servers need to be added to the system.
Modified servers can be tested online; they do not
require building or booting a new kernel and do not
affect the running system.
- Server or device driver malfunction is isolated to the
tasks they are running in.
- Interdependencies between the servers of a system can be
restricted so that the trusted computing base for
security-critical applications can be reduced.
- The mechanisms provided by the µ-kernel (IPC,
multithreading) can be used by all servers and
- A clean µ-kernel interface enforces a more modular
Please also see the answer to the next question.
What does a µ-kernel-based system look like?
- The DROPS
project is an example for a µ-kernel-based system.
In DROPS, real-time (multimedia) and time-sharing
components coexist on one system. In DROPS, a port of the
Linux kernel to L4, L4Linux,
provides a standard time-sharing API; it is binary-compatible to Linux
(i.e., it runs unmodified Linux binaries). L4Linux
not only runs on L4/x86, but also on Fiasco.
Real-time applications use servers which are independent from
L4Linux. However, L4Linux applications
can use these servers, too, in time-sharing mode via stub
drivers in the L4Linux server.
Because of its better support for real-time applications,
Fiasco is intended to replace L4/x86 in the DROPS system.
What is new in the Fiasco µ-kernel?
- Fiasco is the first L4-compatible kernel which supports
real-time applications: The kernel is preemptible at virtually
any time, guaranteeing low activation latencies for threads
with high priorities. Because it is constructed around
non-blocking synchronization strategies,
in-kernel deadlocks and priority inversion are prevented while
at the same time programming the kernel becomes easier.
Other than that, Fiasco is just another implementation of the
L4 µ-kernel interface. It is a second-generation µ-kernel,
faithfully following the L4 design principles: Improving
performance by careful kernel design, and providing only
mechanisms for application writers, but not imposing
So you have written your kernel in C++.
Doesn't that mean that it is slow?
When using C++ carefully, C++ programs are not slower than
programs written in C. C++ just saves a lot of typing effort.
Of course, Fiasco will never reach L4/x86 for low-level benchmarks,
because L4/x86 has been written in hand-optimized assembler code.
But beating L4/x86 is not the point of Fiasco; the point is to
provide a fast, maintainable, readable, and
freely-distributable implementation of the L4 interface.
What hardware does Fiasco run on?
- Fiasco runs on PCs with any x86 CPU from i486 up. A Pentium-class CPU
is recommended. Fiasco doesn't yet support SMP, although we
currently work on an SMP port.
Fiasco can also be configured to run inside
Bochs and Plex86.
Fiasco requires 2 MB RAM and currently manage up to 1GB
(hohmuth 2001/11/06, update: adam 2004/04/20)
Why doesn't Fiasco run on i386s?
- Fiasco needs page-table-based write protection in kernel mode
(WP bit in CR0 register is set), which is available only in
i486s and up.
Linux emulates this mode by explicitly checking for write
protection before writing to user memory. A similar hack could
be added to Fiasco aswell.
Do you plan to port the GNU Hurd to the Fiasco µ-kernel?
- No, we don't. However, there is a group that has started to
work on an L4 port for the Hurd. Please visit
their website. (hohmuth 01/11/02)
- Do you know that in the Italian language, the
word ``Fiasco'' means ``terrible failure''?
- Yes, I do. Thank you for the kind warning.
Here is some news for you: ``Fiasco'' means ``terrible
failure'' in almost any language, including English, Spanish,
Portuguese, and German (where it is actually spelled
I can't get the serial communication
between my test machine and my development host to work.
- Maybe the communication speeds of the two serial interfaces don't match
(check your terminal settings or your
respectively, and check the Fiasco boot command line), or the current
data rate is just too high for your hardware? The default rate is
115200 bits per second. The manpage
describes how to change this setting for Fiasco.
- How do I need to configure Fiasco to run in Bochs or
- Bochs' and Plex86's PC emulation is limited; however you can
configure Fiasco to run despite these limitations.
- In kern/config.cpp, set
pic_prio_modify to CONST_FALSE.
- In kern/config.cpp, set
pic_prio_modify to CONST_FALSE (as
- Additionally, set
hlt_works_ok to CONST_FALSE, and set
broken_cpuid to CONST_TRUE.
- You may need this patch for
Bochs to get the CMPXCHG8B
- When I start Fiasco, I get the error message "failed
assertion: `size != PAGE_SIZE'".
- This is a known bug in an older version of Fiasco. Either
upgrade to the latest version (available via SVN), or
work around the problem by adding the flag
-nopentium to the command line of
Rmgr in your menu.lst file. (hohmuth 2001/11/07)
Last modified: Thu Mar 29 2007, 10.49:01 CEST