Genode components overview

Genode comes with a growing number of components apparently scattered across various repositories. This document provides an overview of these components and outlines the systematics behind them.

Categorization of components

Genode components usually fall into one of four categories, namely device drivers, resource multiplexers, protocol stacks, and applications. Each of them is briefly characterized as follows:

Device drivers

translate hardware resources into device-independent session interfaces. Naturally, a device driver is specific to a particular hardware platform. The hardware resources are accessed via core's IO_MEM, IO_PORT, and IRQ services. The functionality of the driver is made available to other system components by announcing one of Genode's device-independent session interfaces, which are pci_session, framebuffer_session, input_session, block_session, audio_out_session, log_session, nic_session, and timer_session (see os/include/ for the interface definitions). Those interfaces are uniform across hardware platforms and kernel base platforms. Usually, each device driver can accommodate only one client at a time.

Resource multiplexers

provide mechanisms to multiplex device resources to multiple clients. A typical resource multiplexer requests one of Genode's device-independent session interface (usually connected to a device driver) and, in turn, announces a service of the same kind. However, in contrast to a device driver, a resource multiplexer is able to serve more than one client at the same time.

Protocol stacks

translate low-level interfaces to higher-level interfaces (or sometimes vice versa). Typically, a protocol stack comes in the form of a library, which uses a device-independent session interface as back end and provides a high-level library interface as front end. However, protocol stacks also exist in the form of distinct components that implement translations between different session interfaces.

Applications

implement functionality using APIs as provided by protocol stacks.

Runtime environments

enable existing 3rd-party software to be executed as a Genode sub systems.

Device drivers

Device drivers usually reside in the src/drivers subdirectory of source-code repositories. The most predominant repositories hosting device drivers are os, linux_drivers, dde_ipxe, dde_linux.

Platform devices

os/src/drivers/platform/

Platform drivers for various ARM boards.

os/src/drivers/pci

Implements the PCI-session interface using the PCI controller as found on x86 PC hardware. Using this interface, a client can probe for a particular device and request information about physical device resources (using the pci_device interface). These information are subsequently used to request respective IO_MEM, IRQ, and IO_PORT sessions at core.

UART devices

The UART device drivers implement the UART-session interface.

os/src/drivers/uart/pl011

Driver for the PL011 UART as found on many ARM-based platforms.

os/src/drivers/uart/i8250

Driver for the i8250 UART as found on PC hardware.

os/src/drivers/uart/omap4

Driver for the UART as found on OMAP4-based hardware.

os/src/drivers/uart/exynos5

Driver for the UART as found on Exynos-5-based hardware.

Framebuffer and input drivers

Framebuffer and input drivers implement the framebuffer-session interface and input-session interfaces respectively.

os/src/drivers/input/dummy

Pseudo input driver without accessing any hardware. This component is useful to resolve a dependency from an input session for scenarios where no user input is required.

os/src/drivers/input/fiasco_ux

Driver for the virtual hardware provided by the user-mode version of the Fiasco kernel.

os/src/drivers/input/ps2/x86

Driver for the i8042 PS/2 controller as found in x86 PCs. It supports both mouse (including ImPS/2, ExPS/2) and keyboard.

os/src/drivers/input/ps2/pl050

Driver for the PL050 PS/2 controller as found on ARM platforms such as VersatilePB. The physical base address used by the driver is obtained at compile time from a header file called pl050_defs.h. The version of the VersatilePB platform can be found at os/include/platform/vpb926/ and is made available to the driver via the SPECS machinery of the Genode build system.

libports/src/drivers/framebuffer/vesa

Driver using VESA mode setting on x86 PCs. For more information, please refer to the README file in the driver directory.

os/src/drivers/framebuffer/pl11x

Driver for the PL110/PL111 LCD display.

os/src/drivers/framebuffer/omap4

Driver for HDMI output on OMAP4 SoCs.

os/src/drivers/framebuffer/exynos5

Driver for HDMI output on Exynos-5 SoCs.

os/src/drivers/framebuffer/imx53

Driver for LCD output on i.MX53 SoCs.

os/src/drivers/framebuffer/imx53

Driver for touchscreen input on i.MX53 quick start board.

os/src/drivers/framebuffer/rpi

Driver for the HDMI output of the Raspberry Pi.

os/src/drivers/framebuffer/sdl

Serves as both framebuffer and input driver on Linux using libSDL. This driver is only usable on the Linux base platform.

dde_linux/src/drivers/usb

USB driver that makes USB HID and USB storage devices available as input sessions and block session respectively. For examples of using this driver, refer to the run scripts at dde_linux/run/usb_hid and dde_linux/run/usb_storage.

Timer drivers

The timer driver located at os/src/drivers/timer implements the timer-session interface. Technically, it is is both a device driver (accessing a timer device) and a resource multiplexer (supporting multiple timer-session clients at the same time). Depending on the base platform, the implementation uses of different time sources. Time sources are either hardware timers, a time source provided by the kernel, or a pseudo time source (busy):

nova

NOVA kernel semaphores as time source

codezero

busy time source

okl4_arm

busy time source

okl4_x86

PIT as time source

foc

IPC timeout as time source

fiasco

IPC timeout as time source

pistachio

IPC timeout as time source

linux

nanosleep as time source

Audio output drivers

All audio-output drivers implement the audio session interface defined at os/include/audio_out_session/.

os/src/drivers/audio_out/linux

Uses ALSA as back-end on the Linux base platform.

dde_oss/src/drivers/oss

Sound drivers for the most common PC sound hardware, ported from the Open Sound System project.

linux_drivers/src/drivers/audio_out

Sound drivers for the most common PC sound hardware, ported from the Linux kernel.

Block drivers

All block drivers implement the block-session interface defined at os/include/block_session/.

os/src/drivers/atapi

Driver for ATAPI CD-ROM devices on x86 PCs.

os/src/drivers/sd_card/pl180

Driver for SD-cards connected via the PL180 device as found on the PBX-A9 platform.

os/src/drivers/sd_card/omap4

Driver for SD-cards connected to the SD-card controller of the OMAP4 SoC.

os/src/drivers/sd_card/exynos5

Driver for SD-cards and eMMC connected to Exynos-5-based platforms.

linux_drivers/src/drivers/usb

USB driver that makes USB storage devices available as block sessions. For an example of using this driver, refer to the run script at linux_drivers/run/usb_storage.

os/src/drivers/ahci

Driver for SATA disks on x86 PCs.

Network interface drivers

All network interface drivers implement the NIC session interface defined at os/include/nic_session.

os/src/drivers/nic/linux

Driver that uses a Linux tap device as back end. It is only useful on the Linux base platform.

os/src/drivers/nic/lan9118

Native device driver for the LAN9118 network adaptor as featured on the PBX-A9 platform.

dde_ipxe/src/drivers/nic

Device drivers ported from the iPXE project. Supported devices are Intel E1000 and pcnet32.

linux_drivers/src/drivers/madwifi

The MadWifi wireless stack ported from the Linux kernel.

dde_linux/src/drivers/usb

For the OMAP4 platform, the USB driver contains the networking driver.

General-purpose I/O drivers

os/src/drivers/gpio/omap4

Driver for accessing the GPIO pins of OMAP4 platforms.

os/src/drivers/gpio/imx53

Driver for accessing the GPIO pins of i.MX53 platforms.

Resource multiplexers

By convention, resource multiplexers are located at the src/server subdirectory of a source repository.

Framebuffer and input

The framebuffer and input session interfaces can be multiplexed using the Nitpicker GUI server, which allows multiple clients to create and manage rectangular areas on screen. Nitpicker uses one input session and one framebuffer session as back end and, in turn, provides so-called nitpicker sessions to one or multiple clients. Each nitpicker session contains a virtual framebuffer and a virtual input session. Nitpicker (including a README file) is located at os/src/server/nitpicker.

Audio output

The audio mixer located at os/src/server/mixer enables multiple clients to use the audio-out interface. The mixing is done by simply adding and clamping the signals of all present clients.

Networking

The NIC bridge located at os/src/server/nic_bridge multiplexes one NIC session to multiple virtual NIC sessions using a proxy-ARP implementation. Each client has to obtain a dedicated IP address visible to the physical network. DHCP requests originating from the virtual NIC sessions are delegated to the physical network.

Block

The block-device partition server at os/src/server/part_blk reads the partition table of a block session and exports each partition found as separate block session. For using this server, please refer to the run script at os/run/part_blk.

File system

The FFAT file-system service allows multiple clients to concurrently access the same FFAT-formatted block device. It is located at libports/src/server/ffat_fs.

Terminal

The terminal_mux service located at gems/src/server/terminal_mux is able to provide multiple terminal sessions over one terminal-client session. The user can switch between the different sessions using a keyboard shortcut, which brings up an ncurses-based menu.

Protocol stacks

Protocol stacks come either in the form of separate components that translate one session interface to another, or in the form of libraries.

Separate components:

os/src/server/nit_fb

Translates a nitpicker session to a pair of framebuffer and input sessions. Each nit_fb instance is visible as a rectangular area on screen presenting a virtual frame buffer. The area is statically positioned. For more information, please refer to os/src/server/nit_fb/README.

gems/src/server/wm

Window manager that implements the nitpicker session interface but manages each client view as a separate window. The window decorations are provided by a so-called decorator (e.g., gems/src/app/decorator). The behaviour is defined by a so-called window layouter such as the floating window layouter located at gems/src/app/floating_window_layouter/.

demo/src/server/liquid_framebuffer

Implements the same translation as nit_fb but by presenting an interactive window rather than a statically positioned screen area.

os/src/server/tar_rom

Provides each file contained in a tar file obtained via Genode's ROM session as separate ROM session.

os/src/server/fs_rom

Provides files stored in a file system as individual ROM sessions. Please refer to os/src/server/fs_rom for more information.

os/src/server/iso9660

Provides each file of an ISO9660 file system accessed via a block session as separate ROM session.

os/src/server/ram_fs

A file-system implementation that keeps all data in memory.

os/src/server/tar_fs

A read-only file-system implementation that reads data from a TAR archive, which, in turn, is provided by a ROM service.

dde_rump/src/server/rump_fs

A file-system server that contains various file-systems ported from the NetBSD kernel.

os/src/server/lx_fs

A file system server that makes the file system of a Linux base platform available to Genode.

os/src/server/trace_fs

A pseudo file system that can be used as a front end to core's TRACE service.

os/src/server/rom_blk

Provides the content of a ROM file as a block session, similar to the loop-mount mechanism on Linux

os/src/server/ram_blk

Provides the content of a RAM dataspace as a block session. In contrast to rom_blk, this server provides a writeable block device.

os/src/server/terminal_log

Adapter for forwarding LOG messages to a terminal session.

os/src/server/log_terminal

Adapter for forwarding terminal output to a LOG session.

libports/src/server/fs_log

Adapter that writes LOG messages to files on a file system.

demo/src/server/nitlog

Provides a LOG session, printing log output on screen via a nitpicker session.

os/src/server/log_terminal

Forwards terminal output to a LOG session.

gems/src/server/file_terminal

Provides terminal sessions that target files on a file system.

gems/src/server/terminal

Provides a terminal session via a graphical terminal using a framebuffer session and an input session.

gems/src/server/tcp_terminal

Provides one or multiple terminal sessions over TCP connections. For further information, refer to gems/src/server/tcp_terminal/README.

os/src/server/terminal_crosslink

The terminal crosslink service allows to terminal clients to talk to each other.

gems/src/server/http_blk

A block service that fetches a virtual block device over the network from a HTTP server.

os/src/server/fs_rom

A ROM service that translates the File_system session interface to the ROM session' interface. Each request for a ROM file is handled by looking up an equally named file on the file system.

os/src/server/dynamic_rom

A simple ROM service that provides ROM modules that change in time according to a configured timeline.

os/src/server/report_rom

A service that implements both the report session interface and the ROM session interface. It reflects incoming reports as ROM modules.

ports/src/app/openvpn

OpenVPN enables access to remote network resources through a secure tunnel by providing an encrypted connection to a remote host. It is plugged between NIC server (such as a network driver) and NIC client.

os/src/server/input_merger

A component that merges input events from multiple sources into a single stream.

gems/src/server/nit_fader

A wrapper for nitpicker's session interface that applies alpha-blending to the of views a nitpicker client.

Libraries:

libports/lib/mk/libc

C runtime ported from FreeBSD.

libports/lib/mk/libc_log

Redirects the standard output of the libc to Genode's LOG session interface.

libports/lib/mk/libc_lwip_nic_dhcp

Translates the BSD socket API to a NIC session using the lwIP stack.

dde_linux/lib/mk/libc_lxip

Translates the BSD socket API to a NIC session using the Linux TCP/IP stack.

libports/lib/mk/libc_ffat

Accesses files on a block device that contains a FAT32 file system.

libports/lib/mk/libc_fuse_exfat

Accesses files on a block device that contains an exFAT file system.

libports/lib/mk/libc_fuse_ext2

Accesses files on a block device that contains an ext2 file system.

libports/lib/mk/libc_fs

Allows libc-using programs to access the Genode file-system infrastructure using the POSIX file API.

libports/lib/mk/libc_block

Accesses a block session as a virtual block device.

libports/lib/mk/libc_terminal

Connects the standard input and output from/to Genode's terminal session interface.

libports/lib/mk/stdcxx

Standard C++ library

libports/lib/mk/gallium + linux_drivers/lib/mk/gpu_i915_drv

Translates the OpenGL API to a framebuffer session using the MESA OpenGL stack and the Intel GEM GPU driver.

libports/lib/mk/pthread

Subset of the POSIX thread and semaphore API.

libports/lib/mk/python

Runtime of the Python scripting language.

libports/lib/mk/mupdf

PDF rendering engine.

libports/lib/mk/sdl

Translates the libSDL API to framebuffer and input sessions.

libports/lib/mk/ncurses

Library for implementing pseudo-graphical applications (i.e., VIM) that run on a text terminal.

libports/lib/mk/avcodec

A library for video decoding, conversion, and streaming.

libports/lib/mk/lua

Runtime for the Lua scripting language.

qt4

Qt4 framework, using nitpicker session and NIC session as back end.

libports/lib/mk/qt5_*

Qt5 framework, using nitpicker session and NIC session as back end.

libports/lib/mk/vfs_jitterentropy.mk

A VFS plugin that makes a jitter-based random-number generator available as a file within the process-local VFS.

Applications

Applications are Genode components that use other component's services but usually do not provide services. They are typically located in the src/app/ subdirectory of a repository. Most applications come with README files located in their respective directory.

gems/src/app/backdrop

Nitpicker client application that sets a composition of PNG images as desktop background.

demo/src/app/launchpad

Graphical application for interactively starting and killing subsystems.

gems/app/launcher

Graphical launcher of Genode subsystems.

os/app/cli_monitor

Command-line-based launcher of Genode subsystems.

demo/src/app/scout

Graphical hypertext browser used for Genode's default demonstration scenario.

libports/src/app/eglgears

Example program for using OpenGL via the Gallium3D graphics stack.

ports/src/app/arora

Arora is a Qt4-based web browser using the Webkit engine.

ports/src/app/gdb_monitor

Application that allows the debugging of a process via GDB over a remote connection.

qt4/src/app/qt_launchpad

Graphical application starter implemented using Qt4.

qt4/src/app/examples/

Several example applications that come with Qt4.

libports/src/app/qt5

Qt5 examples including qt_launchpad and qt_avplay.

os/src/app/xvfb

Is a proxy application that enables the integration of a virtual X server into a Nitpicker session on the Linux base platform.

ports/src/noux-pkg

Ports of popular commandline-based Unix software such as VIM, bash, coreutils, binutils, gcc, findutils, and netcat. The programs are supposed to be executed within the Noux runtime environment.

ports/src/app/lighttpd

Lighttpd is a fast and feature-rich web server. The port of lighttpd uses a file-system session to access the website content and the web-server configuration.

Runtime environments

ports/src/noux

Noux is an experimental implementation of a UNIX-like API that enables the use of unmodified command-line based GNU software. For using noux, refer to the run script ports/run/noux.run.

ports-foc/src/l4linux

L4Linux is a paravirtualized Linux kernel that enables the use of Linux-based OSes as subsystems on the Fiasco.OC kernel. For using L4Linux, refer to the run script ports-foc/run/l4linux.run.

ports-foc/src/l4android

L4Android is a variant of L4Linux that is able to execute the Android software stack on top of the Fiasco.OC kernel.

ports/src/app/seoul

Seoul is a virtual-machine monitor developed for the use with the NOVA platform. It virtualizes 32bit x86 PC hardware including various peripherals.

os/src/server/loader

A service that allows the creation and destruction of Genode subsystems via a session interface. For further information, refer to os/src/server/loader/README.

ports/src/app/dosbox

A port of DosBox for executing DOS software.

ports/src/virtualbox

VirtualBox running on top of the NOVA hypervisor.