diff --git a/doc/release_notes-12-05.txt b/doc/release_notes-12-05.txt new file mode 100644 index 000000000..32bdcd8b3 --- /dev/null +++ b/doc/release_notes-12-05.txt @@ -0,0 +1,1030 @@ + + + =============================================== + Release notes for the Genode OS Framework 12.05 + =============================================== + + Genode Labs + + + +The best way to characterize version 12.05 of the Genode OS Framework is to +dub it as feature release. Among the numerous additions of new functionality +are a new USB stack, media replay capabilities, and the ability to run the GNU +tool chain including GCC, G++, Binutils, and GNU Make directly on Genode. That +said, the current release is not short of architectural improvements either. +The highlights are the introduction of Genode's file-system infrastructure and +a new concept for the dynamic adjustment of the system's behaviour at runtime. + +The release follows the rough plan we laid out in our +[http://genode.org/about/road-map - road map]. One planned road-map item was +revisiting our base of device drivers as we realized that some important +drivers were not on par with our requirements, the USB stack being the most +important example. Our prior existing solution was originally ported from Linux +2.6.20. It is needless to say that this version is severely limited when it comes +to the use of modern hardware. Instead of continuing to walk the path of the +existing solution, we took the chance to fundamentally re-approach the problem +of porting a complex driver subsystem from the Linux kernel. We are happy to +have found a new methodology that promises to become a much more sustainable +solution for Genode. The rationale behind the new development is described in +detail in section [Re-approaching the Linux device-driver environment]. + +The second major road-map item refers to the Noux runtime environment, which +enables us to run a growing number of unmodified GNU programs natively on +Genode. The abilities of Noux have taken a giant leap forward. The two most +significant improvements are the support of stacked file systems and networking +support. With those in place, we have become able to run most parts of the +Genode tool chain including GCC, G++, Binutils, and GNU Make via Noux. Thanks +to the added networking support, we are able to use basic networking tools such +as netcat as well. + +The third topic according to the road map is file-system support. Version 12.05 +contains the groundwork for this domain. The foundation is the new file-system +session interface. A first implementation of this interface is available in the +form of an in-memory file system. To enable the use of Genode's file-system +facilities by applications, we added support to the C runtime as well as to +Noux. + +In addition to the features planned according to our road map, there are many +new functionalities and improvements. To name a few: By enhancing the existing +configuration concept described in section [System reconfiguration at runtime], +we principally enable components to respond to configuration adjustments +on-the-fly, which clears the way for elegantly solving many problems typical +for general-purpose computing. The port of libav accompanied with profound +changes of our version of libSDL enables us to replay media data. The Fiasco.OC +base platform has received a lot of attention to fully leverage the kernel's +capability concept. Last but not least, the port of Lua interpreter allows for +using this popular scripting language on Genode. + +The release of version 12.05 is accompanied with a slightly updated road map. +The persistent storage topic has been traded for our media player because the +former one naturally builds upon the just recently added file-system interface. +Furthermore, we decided to defer the live CD until July as we realized that we +first need to overhaul low-level components such as USB before the new live +system can be expected to work as intended. Also, some of the scenarios we want +to present depend on framework features that are just introduced with the +current release, in particular the file-system infrastructure and the media +capabilities. + + +Re-approaching the Linux device-driver environment +################################################## + +User-level device drivers are a never-ending quest for microkernel-based +systems. The two most extreme approaches are the development of a custom driver +base developed from scratch, or the use of a virtualized OS as donor of +device-drivers. An example of the former approach is the HelenOS project, which +aspires to conduct the development of all needed device drivers within the +project. The latter approach also known as device-driver OS is domesticated by +NUL (NOVA userland) for networking drivers and the L4Re (Fiasco.OC userland). + +For Genode, neither of both extremes seems to be viable. For the sake of +argumentation, let's consider USB support as an example. We deem the +development of a new USB stack from scratch as a far too elaborative +undertaking, in particular when looking at the functionality we desire. The +feature set of HelenOS's custom-built USB stack is quite illustrative. It +supports HID and USB storage, yet no high-speed devices, nor even more +sophisticated features such as USB 3.0. On the other hand, using the +device-driver OS approach just for providing USB support is unfortunate when +considering that even the most basic devices such as keyboard and mouse depend +on a working USB stack. We would pull in a complete OS kernel (donor kernel) +just for the sake of handling user input. Furthermore device drivers do not +come for free even when using an unmodified donor kernel. Integrating the +donor kernel with the remaining Genode system requires glue code interacting +with the donor kernel. This code would translate driver API calls to Genode +RPC interfaces. Even more importantly for us, the use of a device-driver OS +requires a base platform with support for virtualization. But there is no +virtualization solution that works across all of Genode's base platforms. Quite +the contrary. We experience that each virtualization solution such as L4Linux, +OKLinux, or Vancouver, is largely tied to a particular kernel (Fiasco.OC, OKL4, +or NOVA respectively). Therefore the device-driver OS approach defeats Genode's +inter-kernel portability. Even if we had a portable virtualization solution at +hand, we still would have the problem that for providing the device-driver +service, we need to trust the donor kernel to a certain degree. If the driver +uses DMA, the whole donor kernel must be trusted not to misuse DMA. Even though +IOMMUs are apparently able to relief the problem, they are far from being a +magic bullet for solving it. + +Fortunately, there is a middle-ground to walk on namely porting device drivers +from a "donor OS". We have come a long way to bring the porting work of device +drivers to (a certain level of) perfection. The current release bears the fruit +of our latest achievement in this respect. Let us summarize the long-winded +travel through device-driver porting land that we had so far: + +The naive way is to identify the driver code in the source code of the donor +OS, copying it over and massaging it until it works well in the new +environment. There are two fundamental problems with this way of porting. +First, there is a high likelihood to insert new bugs in the process of +modifying the imported 3rd-party code. But more importantly, each update of the +driver to a new version requires the developer to revisit the modifications. +In many cases, the rationale behind certain changes gets lost over time. The +consequence is that updating drivers becomes a largely dissatisfying kind of +work for which there is always a good excuse to not take it on. + +To limit the trouble of maintaining 3rd-party drivers, the number-one rule +is to not modify 3rd-party driver code. The much better alternative is +to embed the unmodified driver into a so-called device-driver environment. +(DDE). From the driver's perspective, a DDE looks identical to the +donor OS. But the DDE makes the driver talk to custom glue code instead of +interacting with the donor OS kernel. This raises the question of how to +create a maintainable DDE. The first attempts to create a DDE for Linux +device drivers came down to a mix of reimplementing some of the Linux +APIs, taking some other portions of the Linux kernel as is, and modifying +some Linux headers to a certain degree. Each of those categories has its +own set of problems. By reimplementing Linux APIs, one risks to introduce bugs +by not implementing the exact behaviour as the Linux kernel. Because most Linux +APIs have no clear specification other than the kernel code, it is sometimes +hard to capture all semantic details. The problem of introducing bugs can be +alleviated by reusing original code wherever possible. For example, instead of +providing custom memory allocators, it is tempting to just reuse the Linux slab +implementation. The downside of reusing existing code is, however, that such +code tends to depend on further kernel code. Pulling-in the transitive +dependencies leads to more dependencies etc. The temptation of just continuing +to add more and more unmodified kernel code into the DDE can easily go out of +hand. One way to cut out such undesired dependencies is to slightly modify +(parts of) the kernel code. Unfortunately, the category of slightly modified +code usually turns out to become an ongoing maintenance burden. The bottom line +is that finding the right mix of reimplementation, slight modification, and +reuse is a matter of sure instinct of the DDE developer. + +Another way to put it is defining the problem as the search in an optimization +space for the economically most sensible solution. The optimization criterion +we set out to maximize is the ratio of feature code (the actual driver, no DDE +nor glue) to the number of lines of code that must be manually maintained. To +give the order of magnitude of the code we speak of, the traditional Linux DDE +including the support for NIC, USB, and sound is comprised of more than 350.000 +lines of code. The portion of modified or custom written code (code that must +be manually maintained) is more than 40.000 lines of code. Given this +complexity, we found us hesitant to update the code to newer kernel versions. +The engineering labour of such an update is significant yet not much rewarding +work. Apart from the burden of managing a piece of software that complex, our +confidence in the classical Linux DDE approach slipped further with each +debugging session that involved Linux DDE. In our experience, Linux DDE still +significantly deviates from the semantics of the Linux kernel but in subtle +ways. Often problems go unnoticed until a driver uses a kernel API in a +slightly unusual way. For example, a driver calling 'udelay()' from the interrupt +handler. The sheer complexity of the code base can make localizing such issues +a painful experience. This is further amplified by the existence of certain +invariants provided by the Linux kernel but absent in the Linux DDE. One +particular source of trouble is the control flow in the event of an interrupt. +In the Linux kernel, the interrupt handler can make the assumption that no code +of the interrupted CPU can be executed until the interrupt handler returns. In +contrast, Linux DDE models interrupts as independent threads and assumes that +all code is multi-processor safe. Consequently the control flows of the driver +executed in the Linux kernel and the same driver executed in Linux DDE differs +in subtle ways, leading to the worst of all bugs namely race conditions. + +While our focus shifted away from the classical Linux DDE, we discovered the +beauty of creating extremely tight device driver environments. In contrast to +the Linux DDE, which tried to be useful for a large range of driver classes on +the cost of becoming complex, we created new slim DDEs for single drivers or a +strictly outlined class of drivers. One example is the DDE for iPXE networking +drivers. The iPXE boot loader covers most of today's commodity network cards. +The drivers of iPXE are actually Linux drivers adapted to be executed in an +environment as minimalistic as a boot loader. It turns out that a DDE of less +than 1.000 lines of code paves the way towards using a rich base of networking +drivers (more than 100.000 lines of driver code) on Genode. A similarly +positive experience was made for the Intel GEM driver ported from the Linux +kernel. The 18.000 lines of driver code require a DDE of less than 3.000 lines +of code to reuse the driver on Genode. + +These success stories motivated us to proceed going into this direction +when revisiting our USB driver. Our goal was to replace the aging USB driver, +which was based on the original Linux DDE by a new driver conducted via an +USB-specific but onion-skin tight DDE. As a general rule, we forbid ourself to +modify 3rd-party code. To completely remove race conditions from the picture, +we furthermore decided to run the entire driver stack including the handling +of client requests with a single physical thread only. This thread manages +multiple pseudo-thread contexts using cooperative scheduling. + +The result is more than convincing for us. With a DDE of less than 4.000 lines +of code, we have become able to use the unmodified Linux-3.2 USB stack, which +comprises more than 60.000 lines of code. Only 3 lines had to be modified. In +contrast to Linux DDE, the 4.000 lines of custom-written DDE code are +relatively easy to comprehend. For the most of the functions provided by the +DDE, the implemented semantics is a rigid subset of the original functionality +as found in the Linux kernel. Apparently the knowledge about the usage patterns +of the functions in the particular driver allows for vast simplifications. +Given our self-imposed rule to not modify 3rd-party code, we expect that future +updates to new Linux kernel versions will pose much less of a burden. + +With our current approach of creating rigidly tailored DDEs, we are convinced +to have found a healthy balance between the manual effort needed to create and +maintain a base of ported device drivers and the utility those driver provide +to our system. + + +System reconfiguration at runtime +################################# + +By addressing more and more concerns of general-purpose computing, we are +forced to push the boundaries of the framework beyond the limited scope of +special-purpose OSes. The biggest challenge is the accommodation of highly +dynamic workload. With respect to managing physical resources, the framework +was designed from the ground up with those requirements in mind. So there is a +strong basement to build upon. However, another aspect of dynamic systems is +the adaptation of the behaviour of components at runtime. This aspect used to +be an underdeveloped spot of the Genode system. With the API improvements of +the current release, we supplement the existing Genode concepts with profound +support for dynamic policies. + +To give a few examples of such dynamic policies: We expect the audio mixer to +immediately respond to adjusted volume settings. The calibration of pointer +devices might be adapted on-the-fly by the user. We want to change the color +scheme of the GUI without the need to restart the GUI server. Screen +resolutions or the size of text terminals shouldn't be fixed at the start time +but changeable. Also policies such as the assignment of devices to subsystems +are subject to decisions taken at run time rather than at system-integration +time. Of course, each of those problems could be addressed individually by +adding dedicated RPC interfaces to components that support run-time +adjustments. For example, a touchscreen device driver could sport an RPC +interface for allowing the modification of calibration parameters. + +But the information supplied via such configuration interfaces tends to have +a high overlap with configuration information passed to components via +Genode's configuration mechanism, which ultimately leads to uncertainty +about whether to supply such information via the configuration mechanism +or via RPC. The RPC approach also raises the question of how to initialize +dynamic configuration arguments such that the component can operate before +being explicitly configured via RPC. In the best case, a component would +accept both, a static configuration supplied via the existing configuration +mechanism and a dynamic configuration interface exposed via RPC. Obviously, +this spoils the principle of functional orthogonality, making the component +hard to test and maintain. In the worst case, a component may drop the +possibility for static configuration altogether and just rely on configuration +parameters provided via RPC. This way, we introduce a mandatory dependency +of the component from a corresponding configuration component. + +There must be a better solution. Fortunately, there is. The key is to turn the +once static configuration mechanism into a dynamic facility. The configuration +mechanism uses the ROM session interface as underlying mechanism. When a +process requests a ROM module called "config" by opening a ROM session at its +parent, the parent hands out the configuration data of the respective subsystem +via a pseudo ROM dataspace. The process can then attach this dataspace to its +local address space to access the configuration information. This information +is typically expressed as XML, which makes the mechanism powerful enough to +handle arbitrarily structured configuration data. Until now, most components +used to request the 'config' dataspace only once at their start time. Once +obtained, the policy remained in effect for the whole lifetime of the +component. We can turn this static mode of operation into a dynamic one by +letting the component query for a "config" ROM module not only once but +repeatedly during its lifetime. Each time, the program requests its +configuration, the parent may hand out a dataspace with updated information. +The code for parsing the "config" data in the configured component is already +there. The only change is that the code is executed not once but multiple +times. Of course, having each component poll for configuration changes at their +parent at regular intervals won't scale too well. Components should obtain a +new config dataspace only if there is an actual change. To enable the parent to +notify the component of such changes, we enhanced the ROM session interface +with a signalling mechanism. The client (in our case this is the child process) +can register a signal handler that will get notified each time the ROM module +changes. On the reception of such a signal, it can re-evaluate the +configuration information. + +Of course, the configuration file handled by the init process remains to be +static because init is meant to handle the static portions of the system only. +But dynamic config files can be used in three different ways already: First, +requests for config files can be routed to arbitrary ROM services instead of +the immediate parent. The remote ROM service may support the dynamic update of +ROM modules and provide the signalling. An example for such a dynamic policy +component can be found at 'os/run/dynamic_config.run'. In structure, this +scenario corresponds to the approach of having a dedicated policy component +define the runtime policy of a server. But in contrast to the native approach, +the 'dynamic_config.run' scenario solves the initialization problem by letting +the configured component use the policy provider as a service. The second way +of employing dynamic configurations is to run a service as a child subsystem +using the 'Slave' API. An example for this scenario is provided by +'os/run/dynamic_config_slave.run'. The third variety is the use of the loader +service to instantiate subsystems. The ROM modules of such subsystems can not +only be defined by the client of the loader but can be updated at any time +using dynamic ROM sessions. An example for the latter variant can be found at +'os/run/dynamic_config_loader.run'. + + +Base framework +############## + +Support for dynamic ROM sessions +================================ + +As outlined in section [System reconfiguration at runtime], the usefulness of +the ROM session interface has just taken a giant leap with the introduction of +the following tiny function: + +! void sigh(Signal_context_capability sigh); + +This function allows a ROM session client to register for events referring to +the session's ROM module. At first sight, it might be counter intuitive to +expect events originating from such sessions because the most prominent +provider of the ROM service is core, which exports static binary data loaded at +boot time to higher-level components. Naturally, such boot-time modules never +change. But ROM sessions are used elsewhere, in particular by parent processes +for supplying read-only information to child subsystems. For instance, shared +libraries, executable binaries, and configuration data are passed to child +subsystems as ROM modules. But in contrast to core's ROM modules, this +information may be dynamic in nature. For example, the configuration of the +audio mixer may change at any time during the lifetime of the mixer. Also +executable binaries may change in the event of system updates. Providing the +system with the ability to respond to such changes is crucial to the use of +Genode as general-purpose OS. + +For existing users of the ROM session interface, there is nothing to consider. +API compatibility is maintained. However, by installing a signal handler using +the 'sigh()' function, the client will receive a notification each time the +data changes at the server. From the client's perspective, the original data +contained in the currently used dataspace remains unchanged until the client +calls 'dataspace()' the next time. This way, the update of the ROM module at +the client side is transactional. There is no inconsistent intermediate state. + + +Misc +==== + +:Support for non-executable memory mappings: + +Via the newly added 'executable' flag of 'Rm_session::attach()', clients of the +RM service become able to express whether they want a mapping to be executable +or not. This allows dataspaces to be mapped as non-executable by default and as +executable only if needed. + +:Support for process-local pseudo capabilities: + +On some platforms, in particular Linux, we used process-local pseudo capabilities +as helpers to implement the Genode API. In contrast to a normal capability, +which refers to an object accessible via RPC, a pseudo capability is not +more than a glorified pointer. The uses of local pseudo capabilities are +normally constrained to special cases in platform-dependent code. They do not +exist at API level. + +However, our observation of the need for such a utility for platforms other +than Linux prompted us to generalize the local capabilities. The result has +been incorporated into the platform-independent 'base' repository as part of +the 'Native_capability_tpl' interface. At API level, this change is transparent. + + +Low-level OS infrastructure +########################### + +Loader +====== + +The original loader service was primarily motivated by the browser-plugin +scenario presented on our live CD. But since the initial version, we envisioned +this component to become the generic mechanism of choice for scenarios where +subsystems are to be created and removed dynamically at runtime. The current +release introduces a largely revised loader-session interface and a new +implementation of the loader component. The new version widens the application +scope of the service and, at the same time, reduces its implementation +complexity. + +The complexity reduction is achieved by removing the original limitation of +supplying the new sub system as a single binary blob only. The server used to +implement heuristics and functionality for dealing with different kinds of +blobs such as ELF images or TAR archives. This has been replaced by a +session-local ROM service, which can be equipped with an arbitrary number of +ROM modules supplied by the loader client prior starting the new sub system. +Even though the TAR support has been removed, a separate instance of the +'tar_rom' service can be used within the subsystem to provide the formerly +built-in functionality. + +The new loader component is best illustrated by two examples. The traditional +loader example at 'os/run/loader.run' shows how the loader intercepts the +nitpicker session of the loaded subsystem. The corresponding source code +can be found at 'os/src/test/loader/'. The second example at +'os/run/dynamic_config_loader.run' shows how the concept of dynamic ROM +sessions can be combined with the loader. As demonstrated by this example, +ROM images used by the loaded sub system can be updated at runtime by the +client of the loader session. + + +New file-system infrastructure +============================== + +The current release introduces Genode's file-system session interface, provides +a first implementation of this interface in the form of an in-memory file +system, and enables the libc to use the new file-system facility. + +The new interface resides in 'os/include/file_system_session/'. It uses +synchronous RPC calls for functions referring to directory and meta-data +handling. For transferring payload from/to files, the packet-stream interface +is used. We envision that the asynchronous design of the packet-stream +interface fits well with the block-session interface and thereby allows for +hiding I/O latencies when performing subsequent requests in an asynchronous +way. + +[image file_system_stack] + +Compared to Unix-like file-system APIs, Genode's file-system session interface +is much simpler. In particular, it does not support per-file permissions. On +Genode, we facilitate binding policy (such as write-permission) as sessions +rather than individual file objects. + +In-memory file system +~~~~~~~~~~~~~~~~~~~~~ + +As reference implementation of the new interface, there is the new 'ram_fs' +service at 'os/src/server/ram_fs'. It stores sparse files in memory. At the +startup, 'ram_fs' is able to populate the file-system content with directories, +ROM modules, and inline data as specified in its configuration. + +Access to the file system can be tailored for each session depending on the +session's label. By default, no permissions are granted to any session. +To selectively permit access to (a part of) the file system, at least one +policy must be defined. + +The following configuration illustrates the way of how to express policy. + +! +! +! +! +! +! +! +! +! +! set hidden +! +! +! +! +! +! +! +! +! + +The '' sub node of the '' node provides a way to pre-populate +the file system with directories and files. Note that '' nodes can be +arbitrarily nested. Files can be loaded from the ROM service. By adding the +optional 'at' attribute to a '' node, the file name can be defined +independently from the ROM module name. In addition to creating files from +ROM modules, files can be created from data specified directly as part of the +configuration using '' nodes. The content of such nodes is used as +file content as is. + +Session-specific access-control policy is expressed via one or more '' +nodes. At session-creation time, each policy node is matched against the label +of the new session. If the label of a policy node matches, the defined policy +is applied. If multiple policies match, the one with the longest 'label' +attribute (the most specific one) is selected. + +A policy node may contain the following attributes. The mandatory 'root' +attribute defines the view port of the session onto the file system. The +optional 'writeable' attribute grants the permission to modify the file system. + +To illustrate the use of the 'ram_fs' component, refer to the +'libports/run/libc_fs.run' script. + +:Limitations: + +The current state should be regarded as work in progress. In particular, the +error handling and the life-time management of file-system nodes will need +further attention. Functionality-wise, the support for truncating files and +symbolic-link handling are not yet implemented. + +Furthermore, there is much room for optimization, in particular for the +handling of directory entries. Currently, we communicate only one directory +entry at a time, which is suboptimal when traversing large trees. However, we +decided to focus on functionality first and defer optimizations (such as +batching directory entries) to a later stage of development. + +The current implementation does not handle file modification times at all, +which may be a severe limitation for tools that depend on this information such +as GNU Make. + + +File-system plugin for the C runtime +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +To enable libc-using programs to access the new file-system interface, there is +the new libc plugin at 'libports/src/lib/libc_fs'. Using this plugin, files +stored on a native Genode file system can be accessed using the traditional +POSIX file API. + +To see how the three parts described above fit together, the test case at +'libports/run/libc_fs' can be taken as reference. It reuses the original +'libc_ffat' test to exercise several file operations on a RAM file-system using +the libc API. + + +C Runtime +========= + +:POSIX threads and semaphores: + +The new 'pthread' library implements a subset of the POSIX thread and semaphore +API. We plan to extend it as needed. Currently, it is used as support for the +libSDL-based 'avplay' program. + +:Separate setjmp/longjmp into own library: + +The setjmp/longjmp facility comes with the libc but it is fairly free-standing +code, which is useful not only for libc-using programs but also for raw +Genode components, in particular the new USB stack. Therefore, we separated +the setjmp/longjmp code into a separate 'libc-setjmp' library. Even though +the library is prefixed with 'libc' it does not depend on the remaining +parts of the C runtime. + +:Misc: + +* Implementation of '_nanosleep()' +* Let 'mmap()' return aligned anonymous memory + + +Program argument handling +========================= + +The main-function arguments of Genode programs were never used by genuine +Genode components because the Genode's configuration concept is the most +adequate and consistent way of passing parameters to components. + +But most components ported from other systems and not specifically developed +for Genode, expect configuration arguments passed via the argc-argv interface. +One way to reuse such components is to change their way of handling arguments +by the means of patching 3rd-party source code. In some cases (for example +for the Vancouver VMM), this is the preferred way because manual adaptation +work is required anyway. + +On the other hand, there are 3rd-party applications that would be nice to +reuse as is without any manual patching work, for example the libSDL-based +'avplay' or the muPDF example application. To ease the integration of such +programs into Genode setups, we added the new 'config_args' library. At the +startup of the program, this library inspects the config node for arguments and +fills the argv structure to be passed to the 'main()' function. + +The configuration syntax looks as follows: + +! +! +! +! ... +! + +The 'value' attribute of the first '' node becomes 'argv[0]' and so on. + + +DDE Kit +======= + +We added the API call 'dde_kit_timer_schedule_absolute' to the DDE Kit +interface. Traditionally, DDE Kit timers used to be disposed after a single +use. But we learned that there exist use cases for reusing a single timer +object for multiple subsequent timeouts. The 'schedule_absolute' function +accommodates those scenarios. + + +LOG-to-Terminal adapter +======================= + +The new LOG-to-terminal component to be found at 'os/src/server/terminal_log' +provides the LOG service by writing each LOG-output request prefixed by the +session-label to a terminal-session. It thereby enables the routing of LOG +output to different kinds of terminal sessions such as UART drivers, the +graphical terminal, or the TCP terminal. The 'gems/run/terminal_log.run' +script demonstrates the usage of the new component. + + +Optimized blitting on ARM platforms +=================================== + +The blitting library employed by nitpicker and other GUI applications used to +come in the form of two implementations. The generic version implemented the +copying operation via Genode's 'memcpy' function, which conducts a simple +byte-wise copy at relatively poor performance. In practice, the generic fall +back was expected to not being used much as there is an assembly-optimized +implementation for x86 machines. Because there wasn't an ARM-specific +implementation available yet, ARM platforms suffered under the poor performance +of the generic fall-back implementation. To bring the blitting up to speed on +such platforms, we supplemented the blitting library with an ARM-specific +optimized version. + + +Libraries and applications +########################## + +New and updated libraries +========================= + +:Qoost: + +Qoost is a small library developed by Genode Labs for making the development +of Qt4-based applications, in particular applications using QWidgets, more +enjoyable. The library is currently used by the new Qt4-based video player +example at 'qt4/src/app/qt_avplay'. + +:Update of zlib to version 1.2.7: + +Zlib as been updated because the previous version mysteriously disappeared +from the official zlib mirrors. + +:Video codecs via libav: + +The [http://libav.org - libav project] is one successor of the popular +[http://ffmpeg.org/ - FFmpeg] library, which is a comprehensive solution +for video and audio decoding, conversion, and streaming. The version +0.8.2 of libav has been incorporated into the libports repository. + + +Lua for script-based testing +============================ + +The current release of Genode includes initial support for the Lua programming +language, a clean scripting language with excellent portability capabilities - +just ANSI C. Lua comes with a tiny runtime implementation, which recommends it +as base for test scripting or rapid prototyping in Genode. + +Currently, the Lua libraries are accompanied by a small test program +'test-moon', which utilizes the C++ variant of the Lua runtime. The test shows +an exemplary integration of Genode interfaces to print the RAM quota and sleep +for several seconds. The simplicity of the application shows the potential of +this approach. + +In the future, essential Genode interfaces could be made available to Lua +scripts as libraries or classes and 'test-moon' could be extended to a +versatile test tool, which loads and runs test scripts configured with +Genode's config mechanism. Test results can be aggregated, printed, and +analyzed at runtime by scripts. + +:[http://lua.org/]: Lua programming language + + +libSDL +====== + +Motivated by our work on media replay capabilities, we enhanced the port +of libSDL with support for timer, thread, and audio-related functions. + +:SDL timer support: + +Basic support for SDL timers and delay functions has been added. + +:SDL thread support: + +Thanks to the minimal support for pthreads added by the means of the new +'pthread' library, we are able to activate the SDL thread API. The most common +threading and synchronization primitives work but not all features are +supported. We will complement the coverage of support as needed. + +:SDL audio support: + +The new libSDL audio backend enables the use of Genode's audio-session +interface from SDL applications. This way, SDL programs can be combined +with audio drivers as well as with the mixer component. + +The audio volume (in percent) can be configured in the config file of the +SDL application: + +! +! +! + +Note that the SDL audio backend does respond to configuration changes at +run time. By supplying the config dynamically rather than via a static +file, the audio volume may get updated while the SDL application is running. + + +GDB monitor +=========== + +We refined the GDB monitor to facilitate its use for debugging ever more +sophisticated scenarios. + +One of those scenarios is executing the Noux environment within GDB. To execute +a meaningful Noux scenario, we need a way to pass configuration data through +the GDB monitor to the debugging target. This feature has been implemented by +adding a new '' subnode to the '' node at the GDB monitor +configuration. + +Furthermore, we discovered a limitation of the built-in memory-preservation +policy of the GDB monitor. In general, GDB monitor passes all RAM quota to the +debugging target, leaving only a hard-coded quantum of resources for itself. +However, the amount of RAM actually required by the monitor depends on the +behaviour of the debugging target. Each time, the target requests a ROM module, +GDB monitor creates a shadow copy of the ROM module in order to be able to +modify its content. Of course, the shadow copies consume memory, for which GDB +monitor is accounted for. No hard-coded RAM-preservation policy will be able to +cover all usage scenarios. Therefore, we decided to let the user express this +policy explicitly via the GDB monitor configuration. The amount of RAM that GDB +monitor should preserve for itself must be provided via the new 'resource' node +of the GDB monitor configuration. For example, + +! +! +! +! +! +! ... +! +! + + +Media player based on libav +=========================== + +The current release features the initial version of a natively running media +player. It consists of the following pieces. + +:libav: is a framework library for decoding, converting and streaming audio + and video data. The libav library has been incorporated into the 'libports' + repository. + +:avplay: is an example application, which showcases the use of libav + using libSDL to integrate with a host OS. Thanks to our port of libSDL + to Genode, we are able to use the 'avplay' application without modification. + When used on Genode, 'avplay' uses a framebuffer session, an input session, a + timer session, and an audio-out session as back ends. Thereby we are able to + integrate 'avplay' seamlessly with existing components that provide these + interfaces, in particular the audio mixer, framebuffer and input drivers, but + also the nitpicker GUI server. + +:qt_avplay: is a Qt4 frontend to 'avplay'. It spawns an instance of 'avplay' + as a slave process. + +[image media_player] + The unmodified 'avplay' embedded in Qt4-based GUI. + The media file was downloaded from + http://www.youtube.com/watch?v=CbtAP3kUCxs. + +The latter part is particularly interesting because it makes creative use of +Genode's unique service virtualization facilities. The 'qt_avplay' program +(GUI) starts 'avplay' (aka the codec) as a separate child process. When +started, the codec requests a framebuffer session from the GUI. The GUI, in +turn, creates a separate session to the nitpicker GUI server specifically for +displaying the codec's output on screen and hands out the buffer returned by +nitpicker to the codec. However, the GUI retains the privilege to control the +way how the buffer is displayed on screen. By using the 'QNitpickerViewWidget', +the GUI is thereby able to embed the codec's view seamlessly into the Qt4 GUI +as a widget. But both the GUI and the codec have completely independent data +paths to the GUI server. So the operation of the codec does not depend on +proper and timely operation of the GUI. Vice versa, the GUI process cannot be +compromised by the codec because the codec is sandboxed in a separate process. +The GUI interacts with the codec by virtualizing the input session interface +used by the codec. I.e., when the user clicks on the play or pause button, the +GUI submits artificial keyboard events with key codes interpreted by the +'avplay' program. + +Besides the separation of the codec from the GUI, the 'qt_avplay' example is +interesting because it makes use of Genode's new dynamic configuration +facility. The SDL audio backend used by the codec repeatedly evaluates its +configuration during runtime. This configuration includes a volume prescale +factor. Via the dynamic configuration mechanism, the parent (the GUI) is able +to update the value of the volume prescale factor at any time and thereby +influence the behaviour of the codec. + +[image media_effects] + +Furthermore, the concept of running 'avplay' as a slave of the GUI clears the +way to even more sophisticated features such as the transparent addition of +video post-processing steps in the form of individual components. Instead of +connecting the codec directly with the nitpicker session, the GUI may decide to +route the framebuffer-session request to another slave (aka "effect plugin"). +The effect plugin is a component that requests a framebuffer session at its +parent (the GUI) in order to provide a framebuffer service itself (to the GUI). +Each time, its client invokes the 'refresh()' function, the effect plugin +transforms pixels targeting its own framebuffer session. By routing the +framebuffer session between the codec, one or more instances of effect plugins, +and the nitpicker GUI server, any number of effect plugins can be chained +together to form a pipe of video-processing components. All this flexibility +comes with no addition to the Genode API. It is merely the result of composing +plain Genode components. + + +Terminal +======== + +Our custom terminal emulator that is hosted within the 'gems' repository has +been enhanced to support tab characters as well as the escape sequences needed +to use 'ls --color=auto'. + + +Device drivers +############## + +USB +=== + +The new 'dde_linux' repository will host device drivers ported from the Linux +kernel. In contrast to the original 'linux_drivers' repository, 'dde_linux' +does not contain any 3rd-party source code. To download the Linux kernel source +code and extract the drivers, execute the 'make prepare' rule of the top-level +Makefile. The initial version of the 'dde_linux' repository comes with a USB +driver. The porting methodology follows the path of the Intel GEM port. Instead +of attempting to provide a generic Linux environment that works across drivers, +each driver comes with a specially tailored DDE. + +The DDE consists of Genode-specific implementations of Linux API functions as +declared in 'lx_emul.h'. Most of these functions are dummies that must merely +be provided to resolve dependencies at the linking stage. They are called by +unused code-paths. + +As of now, the USB driver supports UHCI and EHCI on the x86_32 platform. It +exposes USB HID devices and USB storage devices via Genode's input-session +and block-session respectively. + +The HID driver supports keyboard and mouse. A run script can be found under +'dde_linux/run/usb_hid.run'. Configuration snippet: + +! +! +! +! +! +! +! + +Note that we observed that certain 1.0 versions of Qemu do not generate mouse +interrupts. The mouse driver should work correctly on Qemu 1.0.93 and above. + +The USB storage driver supports one USB storage device. Hot plugging has not +been tested. A run script can be found under 'dde_linux/run/usb_storage.run'. +Configuration snippet: + +! +! +! +! +! + + +Noux +#### + +Running GCC, binutils, coreutils natively on Genode +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +We introduced support for stacked file systems alongside new glue for accessing +file-system implementations provided via Genode's new file-system-session +interface. Using stacked file systems, an arbitrary number of file systems +(such as TAR archives or file systems implemented as separate Genode +components) can be composed to form one merged virtual file system. + +An example is given via the 'ports/run/noux_bash.run' script. This run script +creates a virtual file system out of multiple TAR archives each containing the +content of a particular GNU package. In addition, one 'ram_fs' is mounted, +which enables Noux to perform write operations. This way, the shell output can +be redirected to a file, or files can be saved in VIM. + +With the implementation of stacked file systems and the writeable RAM file +system in place, we are ready to greatly extend the range of GNU packages that +run (almost) unmodified on Genode. For us, the most important achievement is +the new ability to run binutils, the GNU compiler collection, and GNU Make. To +see Noux executing 'gcc' and 'readelf', please give the +'ports/run/noux_tool_chain.run' script a try. + +Executing binutils and GCC has been successfully tested on OKL4, L4/Fiasco, +and L4ka::Pistachio. Fiasco.OC, NOVA, Linux, and Codezero are not yet +supported. + + +Networking support +~~~~~~~~~~~~~~~~~~ + +We desire to use a wide range of Unix networking tools such as wget, lynx, ssh, +netcat on Genode. For this reason, the second focus of our Noux-related +developments is the added support for networking. The Noux syscall interface +has been extended with system calls for 'socket', 'getsockopt', 'setsockopt', +'accept', 'bind', 'getpeername', 'listen', 'send', 'sendto', 'recv', +'shutdown', 'connect', and 'getaddrinfo'. Within Noux, those system calls +are translated to calls to the libc and the libc-lwip plugin. This design +principally enables us to easily replace the TCP/IP stack in the future if +needed. + +To experiment with the new networking support of Noux, you may use the +'ports/run/noux_net_netcat.run' as a good starting point. The test communicates +a message between two instances of netcat one running on the host system and +one running within the Noux runtime in qemu. + + +Platform support +################ + +Fiasco.OC microkernel +===================== + +Releasing kernel resources +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +By now, the Fiasco.OC base platform was still lacking proper handling of +kernel resources especially the tracking and releasing of capability selectors. +With release 12.02 we introduced a capability map for Fiasco.OC to circumvent +the usage of more than one kernel-selector for the same capability (please, +refer to the release notes 12.02 for further details). +With the current release we turned the capability class of the Fiasco.OC base +platform into a smart-pointer-like object which releases the corresponding entry +from the capability map whenever it detects that a capability gets unused. +Thereby leaking of kernel resources in terms of capability selectors gets +eliminated. + +While reworking the capability handling of the Fiasco.OC base platform the +following problems were solved: + +* A patch for the 'l4_task_cap_equal' syscall in Fiasco.OC was added, that + fixes some false positives, meaning: when comparing two capability selectors + that referenced the same kernel object including the same, rights false + was returned. +* There existed a race-condition when inserting a new capability into the + capability map +* Due to the re-usage of capability ids it was possible that a newly received + capability was exceptionally freed when actually an old entry should be + removed from the capability map +* At some points in the generic code base capabilities were copied in a way + that circumvented tracking by overloading assignment operators respectively + copy constructors effectively breaking the smart pointer semantic + +Basic PandaBoard support +~~~~~~~~~~~~~~~~~~~~~~~~ + +With the current release we introduce basic support to build Genode/Fiasco.OC +for the popular PandaBoard OMAP4 platform. Although most needed drivers are +still lacking, it is at least possible to see core, init, and other +applications via serial line running on the PandaBoard. + +Kernel debugger +~~~~~~~~~~~~~~~ + +The Fiasco.OC kernel debugger's object name buffer was too limited for most +Genode scenarios incorporating more than just a handful of threads. That +complicated debugging sometimes. An additional kernel patch extends the name +buffer. + +Linux +===== + +Using the chroot mechanism +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +When used as component framework on Linux, Genode tries to preserve as many +native Linux features as possible. In some instances, those features go +surprisingly well with Genode. One particular feature is Linux' 'chroot' +mechanism, which is a popular way to execute Linux processes in a jailed +environment. When using Genode, the reliance on a file system is naturally +reduced to a minimum because the framework comes with abstractions vastly +different from a classical file system, namely capability-based naming of +resources. Still, the file system is there and can be exploited. In theory, +segregating different parts of Genode into different 'chroot' environments can +improve the situation. In practice, the use of such platform-specific solutions +raises the question of how to integrate the solution in way that is coherent +with the rest of the framework. + +The new chroot component at 'os/src/app/chroot' makes the use of the chroot +mechanism within Genode scenarios an almost seamless experience. The component +behaves identical to Genode's init process except for the fact that its +subsystem is constrained to a configurable chroot path. The chroot path is +specified using a '' node of the chroot configuration: + +! + +The remaining part of the configuration is identical to the configuration of +init. In fact, under the hood, the chroot component is barely more than a +trampoline mechanism for spawning the actual init binary after taking all +precautions needed to setup the chroot environment. + +To see how to deploy the new facility, please refer to the run script at +'os/run/chroot.run'. The run script uses POSIX file capabilities to allow the +use of the 'chroot' component under the account of a normal user. However, for +granting the needed capabilities, the run script will ask for root permission. + + +Non-executable mappings +~~~~~~~~~~~~~~~~~~~~~~~ + +Up to now, the Genode API provided no way to devise the use of non-executable +memory mappings. There is only the distinction between read-only and +read-writable dataspaces. This limitation becomes a severe limitation when +combining Genode with PaX. This prompted us to introduce the executable flag +to the 'Rm_session::attach()' function using non-executable as the default. So +far, Linux is the only platform that evaluates this flag. Only if set, the +'mmap' syscall will enable 'MAP_EXECUTABLE'. This is actually a rare exception. +The flag is set by the dynamic linker only. For hybrid Linux/Genode programs +(that do use the Linux 'ld-linux.so' instead of Genode's dynamic linker) the +executable flag is never set. + + +OKL4 +==== + +The hard-coded dependency on a '/usr/bin/python2' binary spawned a bit of +confusion (or at least an inconvenience) among Genode users. So we introduced +simple heuristics for determining the actually installed python-2 version +during the 'make prepare' procedure and use the best match. + + +Build system and tools +###################### + +:Support proper shadowing of target.mk files: + +The build system overlays multiple source trees (repositories) such that they +can shadow libraries and include search paths. We have extended the shadowing +concept to build targets. Furthermore, the change of the build system +streamlines the build stage for generating library dependencies, reducing the +processing time of this stage by 10-20 percent. + +:Explicitly use qemu-system-i386 rather than qemu: + +Up to now, the run tool used the plain 'qemu' binary for all (non-Linux) +x86_32 platforms and resorted to 'qemu-system-*' variants for x86_64 and +ARM platforms. To remove this inconsistency, the run tool has been changed +to always use the specific 'qemu-system-*' binary. +