=======================================
                 Future Challenges of the Genode project
                 =======================================


Abstract
########

This document compiles various ideas to pursue in the context of Genode. It is
meant as source of inspiration for individuals who are interested in getting
involved with the project and for students who want to base their student
research projects on Genode.


Applications and library infrastructure
#######################################

:GNU Privacy Guard:

  The [https://gnupg.org/ - GNU Privacy Guard] (GNUPG) is the most widely
  used Free-Software implementation of the OpenGPG standard. It comprises a
  rich set of tools for encryption and key management. For many forthcoming
  application scenarios of Genode such as package management and email
  communication, GNUPG is crucial. Hence, it should be ported to Genode. Such
  a port may leverage Genode's fine-grained component architecture to strongly
  separate network-exposed functionality, the storage of key material, and the
  cryptographic functions.

:VNC server implementing Genode's framebuffer session interface:

  With 'Input' and 'Framebuffer', Genode provides two low-level interfaces
  used by interactive applications. For example, the Nitpicker GUI server uses
  these interfaces as a client and, in turn, exports multiple virtual
  'Framebuffer' and 'Input' interfaces to its clients. This enables a
  highly modular use of applications such as the nesting of GUIs. By
  implementing the 'Framebuffer' and 'Input' interfaces with a VNC server
  implementation, all graphical workloads of Genode would become available over
  the network. One immediate application of this implementation is the remote
  testing of graphical Genode applications running on a headless server.

:Interfacing with the SAFE network:

  The [https://safenetwork.org/ - SAFE network] is an attempt to fix many
  shortcomings of the internet - in particular with respect to privacy and
  freedom - at an architectural level. It is a peer-to-peer communication
  and storage network that does not depend on single point of
  failure or control. It is intriguing to explore the opportunity of
  integrating support for the SAFE network not merely as an application but
  integrated in the operating system, i.e., in the form of Genode components
  or a set of Genode VFS plugins.

:Tiled window manager:

  At Genode Labs, we pursue the goal to shape Genode into an general-purpose
  operating system suitable for productive work. The feature set needed to
  achieve this goal largely depends on the tools and applications daily used by
  the Genode engineers. As one particularly important tool for being highly
  productive, we identified a tiled user interface. Currently, all developers
  at Genode Labs embrace either the Ion3 window manager or the tiled Terminator
  terminal emulator. Hence, we desire to have a similar mode of user
  interaction on Genode as well. The goal of this challenge is to identify the
  most important usage patters and the implementation of a tiled GUI that
  multiplexes the framebuffer into a set of tiled and tabbed virtual
  framebuffers.

  Related to this work, the low-level 'Framebuffer' and 'Input' interfaces
  should be subject to a revision, for example for enabling the flexible change
  of framebuffer sizes as needed by a tiled user interface.

:Interactive sound switchbox based on Genode's Audio_out session interface:

  Since version 10.05, Genode features a highly flexible configuration concept
  that allows the arbitrary routing of session requests throughout the
  hierarchic process structure. Even though primarily designed for expressing
  mandatory-access control rules, the concept scales far beyond this use case.
  For example, it can be used to run an arbitrary number of processes
  implementing the same interface and connecting the different interface
  implementations. One special case of this scenario is a chain of audio
  filters with each using the 'Audio_out' session interface for both roles
  client and server. Combined with the Nitpicker GUI server and Genode's
  support for real-time priorities, this base techniques enable the creation of
  flexible audio mixer / switchboard applications, which require dedicated
  frameworks (e.g., Jack audio) on traditional operating systems. The goal of
  this project is to create a showcase implementation demonstrating the
  feasibility for creating high-quality audio applications on Genode.
  Furthermore, we wish for feedback regarding the current design of our bulk
  streaming interface when used for low-latency applications.

:Graphical on-target IPC tracing tool using Qt:

  Analysing the interaction of components of a multi-server operating system
  such as Genode is important to discover bottlenecks of the system and for
  debugging highly complex usage scenarios involving many processes. Currently,
  Genode handles this problem with two approaches. First, Genode's
  recursive structure enables the integration of a subsystem in a basic
  OS setup featuring only those drivers and components used for the particular
  subsystem. After the successful integration of such a subsystem, it can
  be embedded into a far more complex application scenario without any changes.
  With this approach, the subject to analyse can be kept at a reasonable level
  at integration time. For debugging purposes, the current approach is using
  the debugging facilities of the respective base platforms (e.g., using
  GDB on Linux, the Fiasco kernel debugger, the OKL4 kernel debugger).

  However, in many cases, bottlenecks do not occur when integrating individual
  sub systems but after integrating multiple of such subsystems into a large
  application scenario. For such scenarios, existing debugging methodologies do
  not scale. A tool is desired that is able to capture the relationships
  between processes of a potentially large process hierarchy, to display
  communication and control flows between those processes, and to visualize the
  interaction of threads with the kernel's scheduler.

  Since Qt is available natively on Genode, the creation of both offline and
  on-target analysis tools has become feasible. The first step of this project
  is creating an interactive on-target tool, that displays the interaction
  of communicating threads as captured on the running system. The tool should
  work on a selected kernel that provides a facility for tracing IPC messages.

:Ports of popular software:

  Genode features a ports mechanism to cleanly integrate 3rd-party software.
  Thanks to the C runtime, the flexible per-component VFS, the standard
  C++ library, and the Noux runtime (for UNIX software), porting software
  to Genode is relatively straight forward. The
  [http://genode.org/documentation/developer-resources/porting - porting guide]
  explains the typical steps. A wish list of software that we'd like to
  have available on Genode is available at
  [http://usr.sysret.de/jws/genode/porting_wishlist.html].


Application frameworks and runtime environments
###############################################

:OpenJDK:

  [http://openjdk.java.net/ - OpenJDK] is the reference implementation of the
  Java programming language and hosts an enormous ecosystem of application
  software. The goal of this line of work is the ability to run this
  software directly on Genode. The centerpiece of OpenJDK is Hotspot - the
  Java virtual machine implementation, which must be ported to Genode.
  The initial port should suffice to execute simple example programs that
  operate on textual input. Since Genode has the FreeBSD libc readily
  available, OpenJDK's existing POSIX backends can be reused. The next step
  is the creation of Genode-specific native classes that bridge the gap
  between the Java world and Genode, in particular the glue code to
  run graphical applications as clients of Genode's GUI server. Since
  OpenJDK has been ported to numerous platforms (such as Haiku), there
  exists a comforting number of implementations that can be taken as
  reference.

:Android's ART VM natively on Genode:

  ART is a Java virtual machine that is used for executing applications on
  Android. By running ART directly on Genode, the Linux kernel could be
  removed from the trusted computing base of Android, facilitating the use of
  this mobile OS in high-assurance settings.

:Rust bindings for the Genode API:

  Rust is a low-level systems programming language that ensures memory
  safety without employing a garbage collector. It thereby challenges C++
  as the go-to programming language for high-performance and low-level code.
  Since
  [http://genode.org/documentation/release-notes/16.05#New_support_for_the_Rust_programming_language - version 16.05],
  Genode supports the use of the Rust programming language within
  components. However, to unleash the potential of this combination,
  Genode's API must become available to native Rust code. The intermediate goal
  of this project is the implementation of an example server, e.g., a
  component that provides a terminal-session interface. Thereby, we
  will encounter the problems of bootstrapping and configuration of the
  component, the provisioning of signal handlers and session objects, and
  memory management.

:Go language runtime:

  Go is a popular language in particular for web applications. In the past,
  there were numerous attempts to make the Go runtime available on Genode
  but so far, none of those undertakings have landed in the official
  Genode source tree. To goal of this project is the hosting of
  Go-written applications - in particular networking applications - as
  Genode components. The topic comprises work on the tool-chain
  and build-system integration, the porting the runtime libraries, and
  the glue between the Go and Genode environments.

:Combination of CAmkES with Genode:

  [https://wiki.sel4.systems/CAmkES - CAmkES] is a component framework for
  seL4. In contrast to Genode, which is a dynamic system, CAmkES-based systems
  are defined at design time and remain fixed at runtime. Hence, CAmkES and
  Genode can be seen as the opposite ends of component-based used-land
  architectures. The goal of this project is to build a bridge between
  both projects with the potential to cross-pollinate the respective communities.
  Among the principal approaches are embedding of a single CAmkES
  component as a Genode component (e.g., an individual device driver),
  the hosting of a dynamic Genode system as a component within a
  CAmkES system, or the hosting of a CAmkES system composition as a Genode
  subsystem.

:Runtime for the D programming language:

  The D systems programming language was designed to overcome many gripes that
  exists with C++. In particular, it introduces a sane syntax for meta
  programming, supports unit tests, and contract-based programming. These
  features make D a compelling language to explore when implementing OS
  components. Even though D is a compiled language, it comes with a runtime
  providing support for exception handling and garbage collection. The goal of
  the project is to explore the use of D for Genode programs, porting the
  runtime to Genode, adapting the Genode build system to accommodate D
  programs, and interfacing D programs with other Genode components written in
  C++.

:Using Haskell as systems-development language:

  The goal of this project is the application of functional programming
  i.e., Haskell, for the implementation of low-level Genode components.
  Implementing critical functionalities in such a high-level language instead
  of a classical systems language such as C or C++ would pave the way towards
  analyzing such components with formal methods.

  The use of Haskell for systems development was pioneered by the
  [http://programatica.cs.pdx.edu/House/ - House Project]. A more recent
  development is [http://halvm.org - HalVM] - a light-weight OS runtime for
  Xen that is based on Haskell.


Virtualization
##############

:VirtualBox on top of KVM on Linux:

  Genode's version of VirtualBox replaces the original in-kernel VirtualBox
  hypervisor by the virtualization mechanism of the NOVA hypervisor or the
  Muen separation kernel. Those mechanisms look very similar the KVM
  interface of the Linux kernel. It should in principle be possible to
  re-target Genode's version of VirtualBox to KVM. This way, VirtualBox and
  Qemu/KVM-based virtual machines could co-exist on the same system, which
  is normally not possible. Also, complex Genode scenarios (like Turmvilla)
  could be prototyped on GNU/Linux.

:VirtualBox on top of seL4:

  The [https://sel4.systems - seL4 microkernel] is a modern microkernel that
  undergoes formal verification to prove the absence of bugs. Since version
  4.0, the kernel supports virtualization support on x86-based hardware.
  Genode has experimental support for seL4 that allows almost all Genode
  components to be used on top of this kernel. VirtualBox is an exception
  because it closely interacts with the underlying kernel (like NOVA) to
  attain good performance. We have shown that VirtualBox can be executed
  within a protection domain of the NOVA microhypervisor. The goal of this
  project is the application of this approach to the virtualization
  interface of seL4. The result will be a VM hosting environment that
  ensures the separation of virtual machines via the formally verified
  seL4 kernel.

:Xen as kernel for Genode:

  Using Xen as kernel for Genode would clear the way to remove the
  overly complex Linux OS from the trusted computing base of Xen
  guests OSes.

  Xen is a hypervisor that can host multiple virtual machines on one physical
  machine. For driving physical devices and for virtual-machine management, Xen
  relies on a privileged guest OS called Dom0. Currently, Linux is the
  predominant choice to be used as Dom0, which implicates a trusted computing
  base of millions of lines of code for the other guest OSes.

  Even though Xen was designed as hypervisor, a thorough analysis done by Julian
  Stecklina concludes that Xen qualifies well as a kernel for Genode. For
  example, Julian implemented a version of Genode's IPC framework that utilizes
  Xen's communication mechanisms (event channels and shared memory).

:Genode as virtualization layer for Qubes OS:

  [https://www.qubes-os.org/ - Qubes OS] is a desktop operating system
  that follows the principle of security through compartmentalization.
  In spirit, it is closely related to Genode. In contrast Genode's
  clean-slate approach of building a fine-grained multi-component system,
  Qubes employs Xen-based virtual machines as sandboxing mechanism. In
  [https://blog.invisiblethings.org/2015/10/01/qubes-30.html - version 3.0],
  Qubes introduced a Hypervisor Abstraction Layer, which decouples Qubes
  from the underlying virtualization platform. This exploration project
  pursues the goal of replacing Xen by Genode as virtualization layer
  for Qubes.

:Qemu:

  As we use Qemu as primary testing platform for most of the kernels, a port
  of Qemu to Genode is needed in order to move our regular work flows to
  Genode as development platform. The basic prerequisites namely libSDL and a
  C runtime are already available such that this porting work seems to be
  feasible. In our context, the ia32, amd64, and ARM platforms are of most
  interest. Note that the project does not have the immediate goal of
  using hardware-based virtualization. However, if there is interest,
  the project bears the opportunity to explore the provisioning of the
  KVM interface based on Genode's VFS plugin concept.


Device drivers
##############

:Isochronous USB devices:

  Genode's USB driver supports bulk and interrupt endpoints. Thereby, most
  USB devices like USB storage, user input, printers, and networking devices
  can be used. However, multi-media devices such as cameras or audio
  equipment use isochronous endpoints, which are not supported. The goal
  of this line of work is the support of these devices in Genode. The topic
  touches the USB driver, the USB session interface, an example implementation
  of a USB client driver (using the session interface) for a device of choice,
  and - potentially - the enhancement of Genode's USB-pass-through mechanism
  for VirtualBox.

:Sound on the Raspberry Pi:

  The goal of this project is a component that uses the Raspberry Pi's
  PWM device to implement Genode's audio-out-session interface. Since
  Genode's version of libSDL already supports this interface as audio
  backend, the new driver will make the sound of all SDL-based games
  available on the Raspberry Pi.

:Framebuffer for UEFI and Coreboot:

  By moving away from the legacy BIOS boot mechanism, it is time to
  reconsider closely related traditional approaches such as the use of
  the VESA BIOS extensions for accessing the frame buffer. On UEFI or
  Coreboot systems, there exist alternative ways to initialize and
  access the framebuffer in a hardware-independent way. On the course of
  this project, we will explore the available options and create dedicated
  Genode driver components that use the modern mechanisms.
  For reference, the current state of Genode's UEFI support is documented
  in [https://github.com/genodelabs/genode/issues/2242 - Issue 2242].

:Data Plane Development Kit (DPDK):

  Genode utilizes the network device drivers of the iPXE project, which
  perform reasonably well for everyday use cases but are obviously not
  designated for high-performance networking.
  The [http://dpdk.org/ - DPDK] is a vendor-supported suite of network device
  drivers that is specifically developed for high-performance applications.
  It presents an attractive alternative to iPXE-based drivers. This project
  has the goal to make DPDK drivers available as a Genode component.


Platforms
#########

:Microkernelizing Linux:

  Thanks to Genode's generic interfaces for I/O access as provided by core, all
  Genode device drivers including drivers ported from Linux and gPXE can be
  executed as user-level components on all supported microkernels. However, so
  far, we have not enabled the use of these device drivers on Linux as base
  platform. The goal of this project is the systematic replacement of in-kernel
  Linux device drivers by Genode processes running in user space, effectively
  reducing the Linux kernel to a runtime for Genode's core process. But moving
  drivers to Genode processes is just the beginning. By employing further
  Genode functionality such as its native GUI, lwIP, and Noux, many protocol
  stacks can effectively be removed from the Linux kernel.

  The goal of this project is to evaluate how small the Linux kernel can get
  when used as a microkernel.

:Support for the HelenOS/SPARTAN kernel:

  [http://www.helenos.org - HelenOS] is a microkernel-based multi-server OS
  developed at the university of Prague. It is based on the SPARTAN microkernel,
  which runs on a wide variety of CPU architectures including Sparc, MIPS, and
  PowerPC. This broad platform support makes SPARTAN an interesting kernel to
  look at alone. But a further motivation is the fact that SPARTAN does not
  follow the classical L4 road, providing a kernel API that comes with an own
  terminology and different kernel primitives. This makes the mapping of
  SPARTAN's kernel API to Genode a challenging endeavour and would provide us
  with feedback regarding the universality of Genode's internal interfaces.
  Finally, this project has the potential to ignite a further collaboration
  between the HelenOS and Genode communities.

:Support for the XNU kernel (Darwin):

  XNU is the kernel used by Darwin and Mac OS X. It is derived from the
  MACH microkernel and extended with a UNIX-like syscall API. Because the
  kernel is used for Mac OS X, it could represent an industry-strength
  base platform for Genode supporting all CPU features as used by Mac OS X.

:Linux process containers for supporting Genode`s resource trading:

  Even though the Linux version of Genode is primarily meant as a development
  platform, there exist interesting opportunities to explore when combining
  Genode with Linux, in particular Linux' process containers.
  Linux process containers provide a mechanism to partition physical resources,
  foremost CPU time, between Linux processes. This raises the interesting
  question of whether this mechanism could be used for a proper implementation
  of Genode's resource trading on Linux.
  [http://lwn.net/Articles/236038/ - Process containers introduction...]


Optimizations
#############

:Low-latency audio streaming:

  Genode comes with an audio streaming interface called 'Audio_out' session.
  It is based on a shared-memory packet stream accompanied with asynchronous
  data-flow signals. For real-time audio processing involving chains of Genode
  components, streams of audio data must be carried at low latency, imposing
  constraints to buffer sizes and the modes of operation of the audio mixer and
  audio drivers. The goal of this project is to create a holistic design of the
  whole chain of audio processing, taking thread-scheduling into account. A
  particular challenge is the mixed output of real-time (small buffer, low
  latency) and non-real-time (larger buffer to compensate jitter, higher
  latency) audio sources.

:De-privileging the VESA graphics driver:

  The VESA graphics driver executes the graphics initialization code provided
  by the graphics card via an x86 emulator. To initialize a graphics mode, this
  code needs to access device hardware. Currently, we permit access to all
  device registers requested by the graphics-card's code. These devices include
  the system timer, the PCI configuration registers, and the interrupt
  controller, which are critical for the proper operating of the kernel. The
  goal of this work is to restrict the permissions of the VESA driver to a
  minimum by virtualizing all devices but the actual graphics card.