[[PageOutline(2-3,)]] = Frequently Asked Questions = == Fundamental Concepts == === What is a microkernel? === In a microkernel operating system certain functionality such as device drivers, file systems and networking is moved out from the kernel space to the user space. Code taken out of the kernel runs as a normal user process or processes. The microkernel itself provides only minimal functionality that is necessary for user processes to run and communicate. This strongly contrasts with the traditional monolithic operating systems that keep most of these functions inside the kernel. The main rationale for constructing operating systems along the microkernel design lines has been achieving greater extensibility by forcing most of the operating system policies into the user space parts and leaving the microkernel itself free of policies as much as possible. This makes it possible to use different operating system personalities, potentially even in parallel, on top of the same microkernel and easily change functionality that would have otherwise been hardcoded in the operating system kernel. Note that multiserver microkernels bring the additional benefit of a limited fault-tolerance: a bug in a kernel driver of a monolithic operating system usually results in the crash of the entire system whereas a bug in a user space driver of a microkernel operating system is confined to the user process in which the driver runs. === What is a multiserver? === Within the scope of microkernel operating systems, a multiserver spreads the operating system functionality over multiple user processes. Note how this differs from a single-server microkernel that concentrates all these functions into a single user process. The motivation for structuring the system as a multiserver is the elimination of the single point of failure represented by the single server process in a single-server system. Another advantage of a multiserver system is smaller and simpler components that can communicate only via explicit interfaces. Smaller and simpler components benefit from the separation of concerns, can do one thing really well and are easier to reason about. Explicit interfaces make the components interchangeable and the correctness of the system on the component-granularity level is easier to reason about. At the same time, it is more difficult to use the component in a wrong way. == General HelenOS Questions == === What is HelenOS? === HelenOS is an open-source microkernel-based multiserver operating system written from scratch. It runs on several different CPU architectures (IA-32, x86-64, SPARC V9, SPARC V8, IA-64, PowerPC, ARM, MIPS). HelenOS prides in portability, modularity, clean design and coding style. === What is SPARTAN? === SPARTAN started as a small kernel written by Jakub Jermář for his university assignments. Later it was open-sourced and adopted as the kernel of the HelenOS operating system. Now we either call it just ''the kernel of HelenOS'' or ''SPARTAN''. The SPARTAN kernel gives HelenOS a very solid and well-developed base to build on. It supports multi-tasking, virtual memory and symmetric multi-processing. It also implements the HelenOS IPC, upon which HelenOS user space services are built. === What is HelenOS used for? === Some people fiddle with HelenOS simply as a hobby, some people use it as a device for achieving their professional goals (i.e. in operating systems research). HelenOS is also used as a platform for school assignments for the [http://d3s.mff.cuni.cz/osy Operating Systems course] at the [http://www.mff.cuni.cz/ Faculty of Mathematics and Physics], Charles University, Prague, as well as for the students' bachelor theses, master theses and team software projects. At this point we don't consider HelenOS usable for something different than development and research, but we're getting ''very'' close to the point where it will be usable for something really ''practical''. === What license is HelenOS released under? === All original HelenOS code is covered by a BSD-like license. Some specific third-party components are covered by the GPLv2. See this [wiki:License page] for more details. === Is it based on Linux? Is it UNIX-like? === No. HelenOS is based on original code, from the ground up. It is based on the original SPARTAN microkernel. It does ''not'' mimic any existing system and it is ''not'' meant to be POSIX-compliant or UNIX-like at all. Just as an example, HelenOS does not support {{{fork()}}}. === What does it do, from an end-user's perspective? === We have a command line and a simple graphical user interface which allow you to manipulate files, run applications and mount file systems from disks and disk images. You can play Tetris or edit text files. HelenOS supports multi-national text throughout thanks to using UCS (i.e. Unicode). We also have networking so you can run a simple web server on HelenOS or control HelenOS remotely over the network. HelenOS can play some music for you, too. We have ported some third-party development tools, among which are GCC, binutils, Python and pcc. === What do you aim for with HelenOS? === Mainly three things. One is to create a fully usable operating system (i.e. a system that could be used for at least some everyday tasks, for example to act as a router, a server, a PDA or a desktop), The second goal is to be able to experiment with new ideas and approaches in operating system design and implementation on a system that is designed for practical usability. Last, but not least, the goal of developing HelenOS is to have fun. === How is HelenOS development organized? === HelenOS development is community-driven, with a core team of long-time developers and a loose group of contributors. The primary communication medium for all developers and contributors is our [http://www.helenos.org/list development mailing list]. Since most long-time developers are currently based in Prague (or vicinity), we hold developer meetings in Prague once every month. Minutes are usually published on the mailing list. The decision processes in the HelenOS community could be described as open and consensus-seeking, but meritocratic. A working piece of code weights more than thousand words, but the code must be well-intented, well-designed, well-implemented and well-documented. === Where is HelenOS source code kept? === HelenOS source code is currently managed with [http://bazaar.canonical.com/en/ Bazaar DVCS]. Bazaar is distributed and similar in operation to Git or Mercurial. We have a [wiki:BazaarWorkflow central repository] which is considered as the most current official code base. Several developers also have their private development branches which are publicly viewable (usually on [https://code.launchpad.net/helenos launchpad]). A switch from Bazaar to Git is planned for the near future. === I would like to contribute to HelenOS. Where should I start? === We have several pages on our wiki that should help and guide any prospective contributors. Please read carefully our general [wiki:HowToContribute summary for contributors] and our [wiki:StudentTips tips for (not only) students] (the tips really do not target only students) and the links on these pages. A natural first prerequisite for any contribution is that you are able to [wiki:UsersGuide/CompilingFromSource compile HelenOS from sources and run it]. But note that compiling HelenOS from sources is not necessary for just casually giving it a try (you can easily [wiki:UsersGuide/QuickStart run a pre-built, supported HelenOS image]). If you want to contribute by reporting a bug to us, please [wiki:HowToFileABug read our instructions on how to file a bug]. Also please consider finishing this FAQ, because it might explain the big picture of HelenOS. == Comparison with other systems == === How is HelenOS different from UNIX? === See our [wiki:DiffFromUnix page] which describes some design differences between HelenOS and UNIX-like systems. === How is HelenOS different from GNU Hurd? === [http://hurd.gnu.org GNU Hurd] reimplements UNIX in a multiserver environment on top of the Mach microkernel. As of version 0.7, the Hurd runs on single-processor ia32 systems. Porting effort to amd64 is underway. Some of the Hurd's components, such as parts of the `ext2fs` file server and the `pfinet` networking server are in fact scavenged from ancient versions of Linux, while some other components are original. The networking stack has a single-process architecture. NIC and disk drivers are also taken from Linux, but run as part of Mach in kernel mode. There are experimental versions of the Hurd with support for running Linux 2.6.x networking and disk drivers in user mode via the DDE compatibility layer. The Hurd's hardware support is rather limited. As of version 0.7, it did not support USB or sound. There are, however, experimental PoC's implementing USB and sound via rump kernels. The Hurd is a multiuser system and a huge emphasis is put on structuring it in such a way that unprivileged users can work with the computer without needing to acquire the administrator's privileges for certain tasks (e.g. making untrusted/experimental file systems accessible in the file system namespace). The Hurd offers great flexibility in the dynamic configuration of the system through the translator mechanism. Users can modify behavior for a file system path by interposing their own functionality (i.e. setting a translator) that gets activated on open. There are two GNU Hurd distributions: Debian GNU/Hurd and Arch Hurd. The former includes about 80% of the Debian packages, which is still in the very much respectable order of tens of thousands of packages. HelenOS, on the other hand, is a multiserver environment which does not reimplement any legacy system. It has its own microkernel called SPARTAN. Besides ia32, it also supports amd64, arm32, ia64, mips32, ppc32, sparc32 and sparc64 to varying degrees, some of them in multiprocessor configurations. An overwhelming majority of HelenOS components such as file systems, networking stack, device drivers and GUI have been written specifically for HelenOS, so there is virtually no bloat introduced by various compatibility layers and glue code, neither there is any additional maintenance burden associated with maintaining aging third-party components. The networking stack is decomposed into several processes, each implementing part of the stack such as IP, TCP or UDP. Essentially all HelenOS drivers run in user mode, the exception being kernel drivers used for debugging purposes and the timer and interrupt controller drivers. HelenOS supports both USB and sound (Sound Blaster 16 and Intel HDA). HelenOS is a single user operating system, even though there has been some experimental work done on multiuser support. HelenOS does not have a direct analogy to the translator mechanism, but the system configuration can be dynamically changed by spawning/killing user space servers that implement certain IPC protocols and by stacking services on top of each other. HelenOS currently does not support very many user applications as the development focus is on subsystems, frameworks and drivers. A very limited support exists for running a few standard development tools inside HelenOS (e.g. binutils, gcc, python and some others). See also the following question. === How is HelenOS different from MINIX 3? === [http://www.minix3.org MINIX 3] is a multiserver system which comes with its own microkernel and NetBSD userland. The microkernel does not support threads. As of version 3.3.0, MINIX runs on single-processor ia32 and arm32 systems. Some multiprocessor code is present, but has been unmaintained since version 3.1.x. MINIX 3 comes with two alternative networking stacks. Its own `inet` server and `lwip` server based on the lwIP networking stack. Even though lwIP contains some experimental support for IPv6, both servers are IPv4 only. IPv6 support for the `lwip` server is work in progress. Both `inet` and `lwip` have monolithic architecture that combines IP, UDP and TCP in one process. Some research has been done on making the networking stack modular. The file systems and most of the device drivers have been developed specifically for MINIX. As of version 3.3.0, MINIX supports USB hubs, USB mass storage and the MUSB OTG controller (as found on some !SoCs). The standard USB host controllers or the USB human interface devices are not supported. There are development versions of MINIX 3 that use Linux 2.6.29 USB drivers running inside the DDE compatibility layer. The selling point of MINIX 3 has been its reliability features. MINIX 3 contains a resurrection service that can, in some situations, restart a crashing or misbehaving service. The development version of MINIX 3 supports live update of the running system services. Thanks to its NetBSD userland, MINIX 3 boasts thousands of packages. To avoid much repetition, see also the answer to the previous question. On top of that, the HelenOS kernel implements kernel threads. HelenOS modular networking stack supports both IPv4 and IPv6. The HelenOS USB stack supports UHCI and OHCI. EHCI is supported in a development branch. Drivers for USB hubs, human interface devices (a.k.a. mice and keyboards) and mass storage are available. HelenOS does not come with a resurrection service nor live update. === How is HelenOS different from Genode? === [http://www.genode.org/ Genode] is an operating system component framework which makes it easy to reuse diverse third-party components in a multiserver environment. It supports the combination of several different microkernels (and even monolithic kernels such as Linux) with various original and wrapped user space components (e.g. foreign device drivers wrapped by a DDE layer or a rump kernel). The granularity of the user space components is varying, from fine-grained to large and monolithic. Of course, not all theoretical combinations of components works in Genode and also the feature set can differ. Genode strongly focuses on fair resource accountability of the components. Compared to this, HelenOS is a coherent combination of a single portable microkernel and a multiplatform userland designed and built natively for it from fine-grained components. We strongly prefer designing and implementing our own components to importing foreign components from other systems and wrapping them into bloated compatibility layers, especially when dealing with the critical core components of the operating system. HelenOS supports basic resource accounting, but currently not so elaborate as in the case of Genode. There is an ongoing effort to make some of the HelenOS components (especially the SPARTAN kernel of HelenOS) usable as a Genode component. == Advocacy-related Questions == === Oh, yet another operating system? === No, not at all. There are definitely many more various content management systems, office suites or web browsers out there than there are microkernel-based multiserver operating systems like HelenOS. === Why don't you work on '''' instead? === While HelenOS currently has some gaps in end-user functionality (such as system tools and applications), from many points of view we consider it more advanced than any comparable project. Microkernel is just a label and there are as many ways to write a microkernel system as there are many ways to write an operating system. HelenOS pursues many interesting ideas not found in other projects. HelenOS is portable, clean and modular. And last, but not least, writing HelenOS is fun {{{^_^}}}. === After so many years of development, HelenOS still cannot do ''''? === We are developing a new operating system from scratch as compared to a mere cloning an existing system with an established API. This forces us to figure out and design everything ourselves, which takes time. The HelenOS development process can be characterized as breadth-first rather than depth-first. Breadth-first here denotes the fact that we are writing code which runs on half-dozen processor architectures and is highly multiplatform and portable. This is in strong contrast with the depth-first development model, in which a project quickly gains a lot of desktop features on only one architecture (typically x86) but its poor design prevents it from being ported to more platforms. == Toolchain-related Questions == === Why don't you use Clang as your primary compiler? === We actually do support Clang as an alternative compiler for some architectures (such as ia32 and amd64). But Clang does not currently support all CPU architectures that HelenOS supports, so we use GCC to build HelenOS by default.