mirror of
https://github.com/genodelabs/genode.git
synced 2024-12-30 10:38:55 +00:00
741 lines
39 KiB
Plaintext
741 lines
39 KiB
Plaintext
|
|
|
|
===============================================
|
|
Release notes for the Genode OS Framework 24.05
|
|
===============================================
|
|
|
|
Genode Labs
|
|
|
|
|
|
|
|
The main driver behind Genode 24.05 was the
|
|
[https://genode.org/news/sculpt-os-release-24.04 - recent release] of Sculpt
|
|
OS 24.04 ([https://genodians.org/nfeske/2024-04-26-sculpt-os - What's new?]).
|
|
Among the many usability advances of Sculpt OS is the flexible assignment
|
|
of USB devices to components and virtual machines.
|
|
Section [Fine-grained and dynamic assignment of USB devices/interfaces]
|
|
introduces the underpinnings that made our new quality of life possible.
|
|
Another user-facing feature with a surprisingly deep technical reach is
|
|
suspend/resume. Section [Suspend/resume infrastructure] details the changes of
|
|
the framework on that account. The new ability of seamlessly using the GNU
|
|
debugger on top of Sculpt OS is a game changer for developers
|
|
(Section [On-target debugging using the GNU debugger (GDB)]).
|
|
Further user-visible and user-audible topics are the support for
|
|
high-resolution displays and the wrapped-up transition to our new audio stack
|
|
(Section [Transition to the new audio interfaces introduced in 24.02]).
|
|
|
|
Besides the many usability-motivated topics of our
|
|
[https://genode.org/about/road-map - road map], however, we celebrate
|
|
the break-through of running Sculpt OS directly on our custom microkernel
|
|
alternatively to using a 3rd-party kernel.
|
|
Section [First version of Sculpt OS based on Genode's custom kernel]
|
|
details the background story, the showstoppers we had to overcome, and the
|
|
prospects of this achievement.
|
|
|
|
: <div class="visualClear"><!-- --></div>
|
|
: <p>
|
|
: <div style="clear: both; float: left; margin-right:20px;">
|
|
: <a class="internal-link" href="https://genode.org/documentation/genode-foundations-24-05.pdf">
|
|
: <img class="image-inline" src="https://genode.org/documentation/genode-foundations-title.png">
|
|
: </a>
|
|
: </div>
|
|
: </p>
|
|
|
|
The "Genode Foundations" book covers Genode's architecture, developer work
|
|
flows, and reference material. In tandem with the current release, the
|
|
document received its annual update, which includes not only adjustments
|
|
to the most recent version but also new material about accessing GPIO pins,
|
|
audio, debugging, and prominent APIs like the list model.
|
|
|
|
Further topics of the current release reach from timing and network-throughput
|
|
optimizations, over the profound rework of storage encryption, to updated
|
|
3rd-party software such as Mesa, libSDL2, and Curl.
|
|
|
|
: <div class="visualClear"><!-- --></div> <p></p>
|
|
|
|
|
|
First version of Sculpt OS based on Genode's custom kernel
|
|
##########################################################
|
|
|
|
The ability to use a wide variety of kernels is certainly a distinctive
|
|
feature of Genode. Since the very first version, the framework accommodated
|
|
both a microkernel and the Linux kernel.
|
|
Over the years, we embraced most members of the L4 family of kernels
|
|
([https://genode.org/documentation/release-notes/9.05#Supporting_the_OKL4_kernel_as_new_base_platform - OKL4],
|
|
[https://genode.org/documentation/release-notes/9.02#Genode_on_L4ka__Pistachio - Pistachio],
|
|
[https://genode.org/news/genode-os-framework-release-8.08 - Fiasco],
|
|
[https://genode.org/documentation/release-notes/10.02#Codezero_kernel_as_new_base_platform - Codezero]),
|
|
all object-capability microkernels we could get our hands on
|
|
([https://genode.org/documentation/release-notes/10.02#NOVA_hypervisor_as_new_base_platform - NOVA],
|
|
[https://genode.org/documentation/release-notes/11.02#Support_for_Fiasco.OC - Fiasco.OC],
|
|
[https://genode.org/documentation/release-notes/15.05#Proof-of-concept_support_for_the_seL4_kernel - seL4]),
|
|
and even combined the framework with a static isolation kernel
|
|
([https://genode.org/documentation/release-notes/15.08#Genode_on_top_of_the_Muen_Separation_Kernel - Muen]).
|
|
|
|
Confronting the framework with largely different kernel mechanisms has
|
|
undoubtedly strengthened Genode's software design, but also gave us a great
|
|
depth of insights into the landscape of kernel designs and the implications of
|
|
the respective design choices. It did not take us long to question some of
|
|
these choices, and we started experimenting with custom kernel designs on our
|
|
own. This work made its first appearance in version
|
|
[https://genode.org/documentation/release-notes/11.02#Approaching_platform_support_for_Xilinx_MicroBlaze - 11.02]
|
|
targeting Xilinx Microblaze softcore CPUs.
|
|
Without haste, we steadily evolved this kernel as a research endeavour, mainly targeting ARM CPUs
|
|
([https://genode.org/documentation/release-notes/14.05#Multi-processor_support - SMP],
|
|
[https://genode.org/documentation/articles/trustzone - TrustZone],
|
|
[https://genode.org/documentation/release-notes/15.02#Virtualization_on_ARM - virtualization],
|
|
[https://genode.org/documentation/release-notes/19.08#64-bit_ARM_and_NXP_i.MX8 - 64 bit]),
|
|
and later also addressing the
|
|
[https://genode.org/documentation/release-notes/15.05#Feature_completion_of_our_custom_kernel__base-hw_ - x86]
|
|
architecture.
|
|
|
|
When we
|
|
[https://genode.org/documentation/release-notes/18.02#Sculpt_for_Early_Adopters - started]
|
|
creating Sculpt OS as a Genode-based operating system for commodity PCs, we
|
|
picked NOVA as kernel of choice. NOVA's unique combination of microkernel and
|
|
virtualization mechanisms served us extremely well. It is truly a technical
|
|
marvel! But like any other 3rd-party kernel, it imposes certain complexities
|
|
and points of friction onto the user land. In contrast to 3rd-party kernels
|
|
like NOVA or seL4, which are self-sufficient programs, our custom kernel is
|
|
melted with Genode's core component. This alleviates redundant data structures
|
|
between kernel and user space and makes Genode's resource management directly
|
|
applicable to kernel objects. In other words, it fits like a glove. Hence,
|
|
looking ahead, we foresee a much simpler and ever more coherent trusted
|
|
computing base of Sculpt OS.
|
|
|
|
In order to realize this vision, we had to tackle a couple of long-time
|
|
showstoppers. First of all, we needed to move IOMMU support out of the kernel
|
|
into the user-level platform driver to render it kernel-agnostic. We completed
|
|
a major part of this transition with
|
|
[https://genode.org/documentation/release-notes/23.11#Kernel-agnostic_DMA_protection - release 23.11].
|
|
|
|
Second, virtualization of commodity operating systems is a common use case for
|
|
Sculpt installations, ours at Genode Labs included. Therefore, adding support
|
|
for Intel's Virtual-Machine Extensions (VMX) was another important missing
|
|
piece of the puzzle. Under the hood, we refactored and generalized the
|
|
kernel's x86 hypervisor support to allow for the selection of the available
|
|
virtualization technology at runtime and consolidated code for page-table
|
|
handling. Even though we still have some way to go before the kernel is ready
|
|
to replace the time-tested NOVA hypervisor as the default kernel for Sculpt
|
|
OS, this release is a milestone in that direction.
|
|
|
|
The Sculpt OS variant using our custom kernel is now available as a
|
|
ready-to-use system image at [https://depot.genode.org/jschlatow/image]
|
|
for Intel systems up to 8th generation core processors (Whiskey Lake).
|
|
Note, when using Sculpt's integrated update mechanisms, you must already run
|
|
at least Sculpt 24.04. The system image includes a launcher for running a
|
|
Tiny-Core-Linux VM with a Firefox browser in VirtualBox. The launcher requires
|
|
a window manager that is best deployed by switching to the corresponding
|
|
preset. You also need to enable the _system clock_ and _mixer_ options.
|
|
|
|
Note that there are still a few areas of improvement for this Sculpt variant:
|
|
The IOMMU support currently omits IRQ remapping, which is important to shield
|
|
the system from rogue devices sending arbitrary interrupts. Moreover, we plan
|
|
to improve the kernel scheduling for interactive and time-critical workloads.
|
|
|
|
|
|
Fine-grained and dynamic assignment of USB devices/interfaces
|
|
#############################################################
|
|
|
|
USB support has a long history within the Genode framework and for almost one
|
|
decade its client session API has remained stable. Back in
|
|
[https://genode.org/documentation/release-notes/15.02#USB_session_interface - 2015],
|
|
we split the USB host-controller driver parts from other USB client device
|
|
drivers. Since then, a USB client component could request exactly one USB
|
|
device per session from the USB server resp. USB host-controller driver.
|
|
Moreover, a client had to drive the device in its entirety.
|
|
|
|
This former approach led to some limitations and intricateness. First, USB
|
|
drivers capable of driving more than one device of the same class needed to
|
|
know each device to request in advance. This information was not delivered by
|
|
the USB session but by means of configuration. The out-of-band information
|
|
path complicated the management of USB devices in complex systems like Sculpt
|
|
OS, e.g., when passing arbitrary USB devices to a guest OS running inside a
|
|
virtual machine.
|
|
|
|
The second drawback was related to USB devices with multiple interfaces of
|
|
different interface classes, most prominently, USB headsets with extra buttons
|
|
for volume control. Such devices typically have several USB interfaces for
|
|
audio playback and recording, and at least one interface for HID input events.
|
|
Whereas the development of one driver for each interface class is certainly an
|
|
attainable goal, creating driver mixtures for each potential combination of
|
|
interfaces is unrealistic. Ultimately, we strive to freely operate different
|
|
interfaces of a single device by dedicated drivers.
|
|
|
|
These limitations accompanied us for quite some time, and a design to overcome
|
|
them matured at the back of our minds. With the current release, the USB
|
|
session eventually received its long-anticipated redesign.
|
|
|
|
The new USB session API provides a _devices_ ROM to its client. Within this
|
|
ROM a client can retrieve all relevant information about existing devices it
|
|
is allowed to access. You can think of it as a virtual private USB bus for
|
|
this client. When a new device gets connected that matches the client's policy
|
|
of the USB host controller driver, the ROM gets updated appropriately. If a
|
|
device gets removed physically, it'll vanish from the _devices_ ROM, which
|
|
may, for example, look as follows.
|
|
|
|
! <devices>
|
|
! <device name="usb-1-10" class="0x0" product="USB Optical Mouse"
|
|
! vendor_id="0x1bcf" product_id="0x5" speed="low" acquired="true">
|
|
! <config active="true" value="0x1">
|
|
! <interface active="true" number="0x0" alt_setting="0x0"
|
|
! class="0x3" subclass="0x1" protocol="0x2">
|
|
! <endpoint address="0x81" attributes="0x3"
|
|
! max_packet_size="0x7"/>
|
|
! </interface>
|
|
! </config>
|
|
! </device>
|
|
! </devices>
|
|
|
|
As can be seen in the example, the human-readable XML representation of the
|
|
USB devices already contains most information that normally resides in the
|
|
full-length device descriptor of the USB standard. That means a driver can
|
|
parse relevant information about available configurations, interfaces, and
|
|
endpoints - including their types and identifiers - without the need to
|
|
communicate with the device in the first place.
|
|
|
|
Besides the _devices_ ROM, the new USB-session API consists of an acquire
|
|
function and a function to release a formerly acquired device. The acquisition
|
|
of a device returns a capability to a new device RPC API. This distinct API
|
|
includes a function to obtain a packet-stream buffer to exchange USB control
|
|
requests with the USB host-controller driver. The host-controller driver
|
|
sanity-checks the control requests, and potentially forwards them to the
|
|
device. Thereby, a client can change the configuration of the device, enable
|
|
an alternate interface, or request additional descriptors regarding
|
|
device-class specific aspects.
|
|
|
|
Moreover, the device RPC API provides functions to acquire or release an
|
|
interface of the device. When acquiring an interface, a capability to the
|
|
interface RPC API gets returned. This third new RPC API provides a
|
|
packet-stream buffer to the client, which allows for the exchange of
|
|
interrupt, bulk, or isochronous transfers with the host-controller driver.
|
|
The host-controller driver checks these transfer requests for plausibility,
|
|
and forwards them directly to the device and vice versa.
|
|
|
|
The whole internals of the different RPC API layers, however, are not imposed
|
|
on the developer. Instead, convenient helper utilities are provided within
|
|
_repos/os/include/usb_session/device.h_. Those helper classes simplify the
|
|
acquisition of USB devices and interfaces. Moreover, they support the notion
|
|
of USB Request Blocks (Urbs) on the level of device (control) and interface
|
|
(irq, bulk, isochronous). For an example component that makes use of these
|
|
utilities, please refer to the USB block driver.
|
|
|
|
All components that directly use the USB session have been adapted to the new
|
|
API. This includes the Linux USB driver ports for host controllers, HID, USB
|
|
Ethernet cards, the libusb library port, our XHCI model within VirtualBox, and
|
|
the black-hole component.
|
|
|
|
Practical considerations
|
|
------------------------
|
|
|
|
For users of the framework or Sculpt OS, the most notable change is that all
|
|
USB clients use their own _devices_ ROM to react to device appearance and
|
|
disappearance. No global information is required anymore. That means the
|
|
addition of a new policy rule in the USB host-controller's configuration is
|
|
sufficient to, e.g., let a device appear in a Linux guest. If the rule already
|
|
exists, even the pure physical connect will result in the appearance of the
|
|
device.
|
|
|
|
Because one USB session can now control an arbitrary number of devices, the
|
|
syntax of the policy rules for a USB host controller driver changed a bit:
|
|
|
|
! <config>
|
|
! <policy label="usb_net">
|
|
! <device vendor_id="0x0424" product_id="0xec00"/>
|
|
! </policy>
|
|
! <policy label="usb_hid">
|
|
! <device class="0x3"/>
|
|
! </policy>
|
|
! <policy label="vm">
|
|
! <device name="usb-2-2"/>
|
|
! <device name="usb-2-4"/>
|
|
! </policy>
|
|
! </config>
|
|
|
|
As you might notice, there is no differentiation in the policy rules on the
|
|
interface-level yet. In short, each device is still handled by only one
|
|
driver. As a prerequisite to assign drivers to individual interfaces, drivers
|
|
first have to become resilient against denied device-acquisition attempts.
|
|
This is not the case for most ported drivers or virtualized guest OSes. Hence,
|
|
even though the USB session API is now prepared for driving interfaces of one
|
|
USB device by dedicated drivers, we decided against activating this feature on
|
|
the policy level at the current time. Nonetheless, once a set of interface
|
|
drivers gets in place, we can enable the added flexibility without touching
|
|
the USB session API again.
|
|
|
|
Sculpt OS
|
|
---------
|
|
|
|
The outcome of this line of work is already present in
|
|
[https://genodians.org/nfeske/2024-04-26-sculpt-os - Sculpt OS 24.04], which makes the
|
|
[https://genode.org/documentation/articles/sculpt-24-04#Assignment_of_USB_devices_to_components - assignment of USB devices]
|
|
to components intuitive and secure.
|
|
|
|
|
|
On-target debugging using the GNU debugger (GDB)
|
|
################################################
|
|
|
|
The renovation of our debugging monitor in
|
|
[https://genode.org/documentation/release-notes/23.08#Multi-component_debug_monitor - Genode 23.08]
|
|
was driven by the vision of easy on-target debugging on Sculpt OS. Just
|
|
imagine, any runtime component from applications over device drivers to VMMs,
|
|
like VirtualBox, could be started with debugging optionally enabled. The key
|
|
to make this vision come true is the debug monitor at the heart of the Sculpt
|
|
runtime. All other missing ingredients for viable on-target debugging - above
|
|
all a GDB front end - are introduced with this release.
|
|
|
|
The _debug monitor_ component got introduced in version
|
|
[https://genode.org/documentation/release-notes/23.08#Multi-component_debug_monitor - 23.08].
|
|
It is a drop-in replacement for the init component with the added ability to
|
|
control the execution and memory content of selected child components using
|
|
the GDB remote serial protocol. On Sculpt, the debug monitor now acts as the
|
|
runtime init component. The user decides which components are made available
|
|
to debugger control with a check mark in the launcher menu before the
|
|
component is started. If the component is selected for debugging, the monitor
|
|
configuration part for this component is added to the Sculpt runtime
|
|
configuration.
|
|
|
|
The [https://www.sourceware.org/gdb/ - GDB] component is the user-facing part
|
|
of the debugging experience. It presents a command line interface in a
|
|
graphical terminal window and communicates with the debug monitor in the
|
|
background. The user can enter GDB commands for inspecting and modifying the
|
|
state of monitored components.
|
|
|
|
In order to debug a component in a meaningful way, GDB usually needs to
|
|
evaluate the executable files of the component and profits hugely from
|
|
additional debug information like symbol names and source-code location
|
|
information generated by the compiler. As this information can take up a lot
|
|
of space, we decided to store it in separate debug info files shipped in
|
|
dedicated _dbg_ depot packages since version
|
|
[https://genode.org/documentation/release-notes/23.11#Debug_information_for_depot_binaries - 23.11].
|
|
Two small support components help to make this information available to GDB at
|
|
runtime:
|
|
|
|
The _dbg_download_ component can be started by the user by checking the
|
|
_download debug info_ option in the Sculpt launcher menu. It evaluates the
|
|
Sculpt runtime configuration in the background and downloads any missing _dbg_
|
|
archive content of monitored components into the depot.
|
|
|
|
The _gdb_support_ component is started automatically together with GDB. It
|
|
evaluates the Sculpt runtime configuration in the background and dynamically
|
|
creates directories with symbolic links to the depot binaries and debug info
|
|
files of monitored components in a RAM file system shared with GDB, and
|
|
thereby allows GDB to access these files in a convenient way.
|
|
|
|
[image on_target_gdb]
|
|
|
|
With this setup in place, the user can debug multiple components at once
|
|
and control the execution of threads on an individual basis thanks to GDB's
|
|
_non-stop_ mode.
|
|
Learn how to integrate and use GDB on Sculpt with our article and screencast
|
|
video on [https://genodians.org/chelmuth/2024-05-17-on-target-debugging - Genodians.org].
|
|
|
|
One noteworthy challenge discovered while testing on Sculpt was that GDB
|
|
apparently was not prepared for the case that there are no initial inferiors
|
|
and that the first inferior could appear spontaneously on the remote side
|
|
instead of being actively started by GDB. We had to make some adaptations to
|
|
the GDB source code to support this situation and some more adaptations might
|
|
be necessary in the future, for example to update the output of the
|
|
_info inferiors_ command when the first inferior appears.
|
|
|
|
|
|
Base framework and OS-level infrastructure
|
|
##########################################
|
|
|
|
Transition to the new audio interfaces introduced in 24.02
|
|
==========================================================
|
|
|
|
In Genode's
|
|
[https://genode.org/documentation/release-notes/24.02#Revised_audio_infrastructure - February release],
|
|
we introduced new audio 'Record' and 'Play' sessions intended to supersede the
|
|
old 'Audio_in' and 'Audio_out' interfaces. In the time following up to the
|
|
current release, we worked on integrating the new sessions into the existing
|
|
components. In fact, they are already exercised in the most recent
|
|
[https://genode.org/news/sculpt-os-release-24.04 - Sculpt release].
|
|
|
|
As most prominently used by ported software, the VFS OSS plugin plays a vital
|
|
role in interfacing with Genode's native audio stack. The already existing
|
|
VFS plugin got renamed to _legacy_oss_ while the new one takes its place and
|
|
is usable as a drop-in replacement. Existing users have to adapt the session
|
|
routes accordingly or change their VFS configuration to make use of the
|
|
legacy plugin, if the use of the new sessions is not yet desirable.
|
|
|
|
In contrast to the old plugin, it is possible to configure the fragment size a
|
|
client is allowed to use via its configuration and thereby enforce its latency
|
|
requirements. The fragment size ranges from 2048 to 8192 bytes, which equals a
|
|
period length of around 11.6 to 46.4 ms when using a sample rate of 44.1 kHz.
|
|
The plugin leverages the ability of the _report_play_mixer_ to convert sample
|
|
rates. However, to constrain the resource requirements of the plugin, it is
|
|
limited from 8 kHz to 48 kHz, which covers a reasonable range. Please consult
|
|
the _repos/gems/src/lib/vfs/oss/README_ file for more information.
|
|
|
|
The _black_hole_ component gained additional support for providing the play
|
|
and record sessions so that it is able to perform its role when using the new
|
|
sessions. We also removed the custom audio subsystem from our SDL1.2 port in
|
|
favor of using its own OSS back end, which brings it in line with our SDL2
|
|
port.
|
|
|
|
As there are no critical components left that exclusively use the old sessions
|
|
directly, the way is paved to remove them. However, we keep the legacy audio
|
|
sessions intact to give users time to migrate their components and become
|
|
comfortable with the new interfaces.
|
|
|
|
|
|
Improved timing stability
|
|
=========================
|
|
|
|
Our recent work on real-time audio processing moved the timing characteristics
|
|
of the framework into focus. Low latency cannot be attained in the presence of
|
|
high jitter. But in a component-based system carrying general-purpose
|
|
workloads, jitter can be induced for many reasons including kernel scheduling,
|
|
spontaneous high-priority events, or the interference between clients of
|
|
shared services. The timer driver in particular is such a shared service.
|
|
While analyzing the timer's behaviour under stress, we indeed observed
|
|
unwelcome interference between timer clients. E.g., the stability of a
|
|
waveform generated at a period of 5 milliseconds would be effected by
|
|
otherwise unrelated spontaneous USB-HID events. Those observations motivated
|
|
the following improvements:
|
|
|
|
First, we simplified the timer implementation to make it dead-simple to
|
|
understand and straight-forward to trace its behavior. The timer no longer
|
|
relies on TSC-interpolated measurements but only on ground-truth values
|
|
obtained from the timing device (or from the underlying kernel). Second, to
|
|
improve accuracy at the client side, the timer no longer limits the time
|
|
resolution when the current time is queried. The deliberate limiting of the
|
|
time resolution is applied only to the triggering of timeouts in order to cap
|
|
the timer's CPU load induced by its clients. Third, to limit the rate of
|
|
inter-component communication, the timer batches the wake-up of clients that
|
|
have timeouts closely clustered together. Combined, those measures reduced the
|
|
cross-client interferences between timer clients comfortably below the level
|
|
relevant for our synthetic test setup using audio periods of 5 ms. Note that
|
|
such small periods are not generally usable in practice because real-world
|
|
audio applications are subjected to additional sources of jitter.
|
|
|
|
The improvements are in effect for the timers used on NOVA, the base-hw
|
|
kernel, and the PIT-based timer as used on seL4, OKL4, and Pistachio. Linux,
|
|
Fiasco.OC, and L4/Fiasco are not covered yet.
|
|
|
|
|
|
Device drivers
|
|
##############
|
|
|
|
Linux-device-driver environment (DDE)
|
|
=====================================
|
|
|
|
Porting Linux drivers to Genode is a multi-staged process with the
|
|
configuration of a minimal yet functional platform-specific Linux kernel as
|
|
an essential step. The device support in this kernel is the baseline and
|
|
reference for the final Genode driver. To simplify the testing of minimal
|
|
kernel images, we introduced new run scripts for i.MX boards and PCs. Now, a
|
|
plain execution of 'make run/pc_linux' or 'make run/imx_linux' runs Linux on
|
|
the test target as known from Genode scenarios. In case of i.MX, a FIT image
|
|
is generated, whereas we provide an i.PXE-bootable image for PCs. The run
|
|
scripts integrate busybox into an initial RAM disk and, for i.MX, amend this
|
|
image with _memtool_, a tool by Pengutronix to inspect all kind of memory
|
|
under Linux (via _/dev/mem_).
|
|
|
|
Furthermore, we address some deficiencies in DDE Linux with this release.
|
|
We improved support for fine-grained, sub-millisecond timing by enabling
|
|
high-resolution timers and attended to a long-standing pc_nic_drv link reset
|
|
bug that manifested in some situations on some platforms only. For driver
|
|
developers, we added the 'lx_emul_trace_msg()' function for the generation
|
|
of low-overhead trace entries that can be used to debug timing-sensitive or
|
|
high-traffic scenarios.
|
|
|
|
|
|
Intel framebuffer and GPU driver
|
|
================================
|
|
|
|
An essential prerequisite for providing a GUI as Sculpt OS does, is having a
|
|
driver for the graphics controller. In Genode, this task is split between the
|
|
framebuffer driver and the GPU driver. Exposing these to a growing range of
|
|
devices led to a few robustness and compatibility improvements for the Intel
|
|
framebuffer/GPU drivers.
|
|
|
|
In the context of the latest Sculpt release, we made the accounting of maximum
|
|
framebuffer memory configurable. Previously, this was derived from the
|
|
component's RAM quota, which implicitly limited the maximum display
|
|
resolution. The separate configuration explicitly sets the maximum framebuffer
|
|
memory by default to 64 MiB, which suffices for resolutions of at least
|
|
3840x2160. The actual memory used by the component depends on the configured
|
|
display resolution. If the RAM quota is depleted, the component will issue a
|
|
resource request. The configuration follows the scheme established for the GPU
|
|
driver with
|
|
[https://genode.org/documentation/release-notes/24.02#Dynamic_aperture_handling_for_high_resolution_framebuffers - release 24.02].
|
|
|
|
In this release, we also incorporated a vendor check in the Intel framebuffer
|
|
driver in order to ensure that it only operates Intel devices. Our central
|
|
platform driver typically hands out all VGA-class devices to the driver,
|
|
including GPUs of other vendors. This caused issues on platforms with an
|
|
additional Nvidia GPU for multiple users. Thanks to Alice Domage for this
|
|
contribution.
|
|
|
|
Furthermore, we fixed a few issues that popped up when test-driving Sculpt OS
|
|
on the ZimaBlade. By doing this, we added support for Intel HD Graphics 500 to
|
|
the Intel framebuffer/GPU drivers. This GPU can be found in various Intel
|
|
Processors in the Pentium/Celeron N-series.
|
|
|
|
|
|
Suspend/resume infrastructure
|
|
=============================
|
|
|
|
As planned in our [https://genode.org/about/road-map - road map], we
|
|
integrated the current state of x86 suspend/resume as a feature into Sculpt
|
|
OS. The sculpt manager got enhanced to drive the system state and manage the
|
|
life cycle of driver components during suspend-resume cycles.
|
|
The new
|
|
[https://genode.org/documentation/articles/sculpt-24-04#System_power_control - power options]
|
|
can be found in the _System_ menu once the ACPI support option is activated.
|
|
|
|
[image sculpt_24_04_system_power]
|
|
|
|
Non-stateful drivers are removed from the runtime before suspending and are
|
|
restarted during resume, e.g., network drivers. Stateful drivers like NVME,
|
|
AHCI, and GPU drivers participate cooperatively in the system states by
|
|
stopping their processing and reporting their fulfillment. Currently, the USB
|
|
host driver needs to be restarted forcefully on resume. To avoid data loss,
|
|
the power suspend feature is not offered while a USB block device is in use.
|
|
|
|
Additionally, during Sculpt integration, several drivers got enhanced. The
|
|
acpica application now reflects the completion of the last action, which the
|
|
sculpt manager monitors and incorporates into the system state machine. The PC
|
|
platform driver saves and restores the IOMMU configurations before and after
|
|
suspend. Additionally, the platform driver gained the ability to trigger the
|
|
final suspend RPC to Genode's core. Furthermore, the Intel display driver now
|
|
participates in the system state changes by switching off all connectors
|
|
before suspend in order to reduce graphical noise on displays during the
|
|
transition.
|
|
|
|
|
|
Mesa updated to version 24.0.1
|
|
==============================
|
|
|
|
With the goal to add support for more recent Intel GPUs (Alder Lake+), we took
|
|
the first step by updating our three-year-old Mesa 21 to version 24. Because
|
|
Mesa is under heavy development, the effort to do so was more elaborate than
|
|
anticipated. For the current release, we enabled all the previously supported
|
|
GPUs, which are Intel Gen8 (Broadwell), Gen9 (Skylake up to Whiskey Lake),
|
|
Gen12 (Tiger Lake) using the Iris Gallium driver, Vivante as found in i.MX8
|
|
SoCs, and Mali on the PinePhone. There are still many improvements to be
|
|
explored, like buffer life-time management, using Mesa's native build system
|
|
(Meson) for simplifying future updates, testing Alder Lake, replacing softpipe
|
|
with llvm for software rendering, and adding Vulkan support, to name a few.
|
|
We are looking forward to tackle these topics in future Genode releases.
|
|
|
|
|
|
Removed obsolete loader component and session interface
|
|
=======================================================
|
|
|
|
The loader was originally introduced in version
|
|
[https://genode.org/documentation/release-notes/10.11#Qt4 - 10.11] as part of an
|
|
early [https://genode.org/news/genode-live-demonstration-2010-11 - live CD].
|
|
It later served the purpose of dynamically starting and stopping preconfigured
|
|
subsystems. As of today, the latter use case has long been covered by the
|
|
dynamically reconfigurable init component. The only substantial client of the
|
|
loader remained to be the qpluginwidget in combination with the Arora web
|
|
browser. But as the blending of plugins with websites never moved beyond a
|
|
fancy tech demo and Arora was replaced by Falkon, the current release removes
|
|
the now obsolete loader infrastructure.
|
|
|
|
|
|
Libraries and applications
|
|
##########################
|
|
|
|
Consolidation of Tresor block encryptor and File Vault
|
|
======================================================
|
|
|
|
Genode [https://genode.org/documentation/release-notes/23.05#Revision_of_Genode_s_custom_block-encryption_infrastructure - 23.05]
|
|
marked a big update of the core logic for block-data security and management
|
|
behind the file vault. It replaced the former Ada/SPARK-based implementation
|
|
called CBE with a C++-based, modernized library that we named _Tresor_. As a
|
|
side effect of this endeavor, we improved testing and fixed many issues of the
|
|
former approach. However, the tresor library also inherited some unwelcome
|
|
traits from its predecessor. The CBE approach was shaped in many ways by the
|
|
semantic restrictions imposed by SPARK and the tresor library had retained
|
|
some of these at the expense of code redundancy. In addition, we had adopted a
|
|
rather peculiar approach to execution flow that led to unforeseen
|
|
implementation complexity down the road. In order to improve this situation,
|
|
the current release comes with a comprehensive re-design of the tresor
|
|
library, relieving it from legacy burdens, significantly shrinking the code
|
|
base, and making it much easier to understand.
|
|
|
|
Once warmed up with the topic, we stepped one level up in the block-encryption
|
|
stack and continued reworking the tresor VFS plugin because it also suffered
|
|
from over-complexity and redundancy. After finishing that, we noticed that the
|
|
next higher layer - the File Vault - could also be improved in two ways:
|
|
First, the file vault used to combine two unrelated tasks in one component:
|
|
The logic for modeling typical user work-flows on the tresor VFS and the
|
|
operation of a graphical user interface. We found that these are better
|
|
assigned to separate components that work together via a narrow and
|
|
well-defined interface. Second, the file vault used to operate directly on
|
|
the low-level interface of the menu view component in order to drive its GUI
|
|
instead of using the newer and far easier dialog API for this purpose.
|
|
|
|
[image file_vault_gui]
|
|
|
|
For the component that deals with the logic, we stayed with the name
|
|
_file vault_ whereas the new front-end is the _file vault gui_.
|
|
|
|
Putting all these changes together, the whole ecosystem around the tresor block
|
|
encryption and the file vault becomes far more manageable and its code base
|
|
has been cut in half while providing the same feature set as before:
|
|
|
|
component | 23.05 | 24.05 | difference
|
|
-----------------------------------------------------------
|
|
-----------------------------------------------------------
|
|
lib/tresor | 14374 | 5212 | -63%
|
|
-----------------------------------------------------------
|
|
lib/vfs/tresor | 2728 | 1823 | -33%
|
|
-----------------------------------------------------------
|
|
lib/vfs/tresor_crypto | 1162 | 1213 |
|
|
-----------------------------------------------------------
|
|
lib/vfs/tresor_trust_anchor | 1800 | 1992 |
|
|
-----------------------------------------------------------
|
|
app/tresor_init | 159 | 93 |
|
|
-----------------------------------------------------------
|
|
app/tresor_init_trust_anchor | 166 | 163 |
|
|
-----------------------------------------------------------
|
|
app/file_vault | 5429 | 1256 | -76%
|
|
-----------------------------------------------------------
|
|
app/file_vault_gui | - | 617 |
|
|
-----------------------------------------------------------
|
|
-----------------------------------------------------------
|
|
total | 25818 | 12369 | -52%
|
|
|
|
But the update is not only about cleaning up. We also consolidated the stack
|
|
by, for instance, fixing and re-enabling asynchronous rekeying, implementing
|
|
robust handling of corner-case configurations, patching several performance
|
|
limitations, and further improving the test suite.
|
|
|
|
Last but not least, the file vault received two handy usability enhancements.
|
|
First, the new file-vault GUI is fully controllable via keyboard.
|
|
The hotkeys are documented in _repos/gems/src/app/file_vault_gui/README_.
|
|
Second, as an implication of separating GUI from logic, the text-based
|
|
interface of the file vault became the canonical way to steer that component.
|
|
In order to achieve that, the interface had to be extended to the full feature
|
|
set, which has the welcome side effect of easing the combination of the file
|
|
vault with alternative front ends. For instance, the file vault could now
|
|
become an integrated part of the administrative user interface of Sculpt OS.
|
|
The new interface is mostly backwards compatible (only the non-functional
|
|
version attribute disappeared) and documented in
|
|
_repos/gems/src/app/file_vault/README_.
|
|
|
|
Despite the extensive overhaul, file vault version 24.05 remains compatible
|
|
with old containers created via the 23.05 version and we also kept the
|
|
structure and appearance of the new graphical front end close to that of the
|
|
old version in order to make the transition as smooth as possible.
|
|
|
|
|
|
VirtualBox network-throughput improvements
|
|
==========================================
|
|
|
|
The Uplink and NIC session interfaces provide means to batch several network
|
|
packets before informing the other side to process the packets. The batching
|
|
is crucial to achieve good network throughput and also to keep the CPU
|
|
overhead per packet at a moderate level. Up to now, our ports of VirtualBox
|
|
did not leverage this feature, which became noticeable on systems under high
|
|
CPU load. By adding the batching of network packets to our VirtualBox ports,
|
|
we were able to reduce the CPU load and achieve stable throughput
|
|
measurements, which otherwise fluctuate more depending on other factors like
|
|
scheduling.
|
|
|
|
|
|
Seoul virtual machine monitor
|
|
=============================
|
|
|
|
Since the
|
|
[https://genode.org/documentation/release-notes/24.02#Seoul_VMM - previous]
|
|
release, the VMM received several improvements.
|
|
|
|
Notably, the former global motherboard lock got replaced by fine-grained
|
|
locking within each device model where appropriate. Thanks to the better CPU
|
|
utilization, long-running work, for example compilation, now finishes earlier.
|
|
The network binding got reworked and now reflects network link-state changes
|
|
from the Genode interface into the guest VMs. The legacy audio-session binding
|
|
got replaced by Genode's new Play interface.
|
|
|
|
The so far unused ACPI model of the Seoul sources got enabled and adjusted
|
|
to support so-called fixed ACPI events, e.g., power-button press event. On
|
|
GUI window close, the event is now triggered and forwarded to the guest VM.
|
|
Depending on the configuration of the guest, the VM may power down
|
|
automatically, similar as done by our port of VirtualBox.
|
|
|
|
Finally, a USB XHCI model powered by our qemu-usb library has been added to
|
|
Seoul, which got developed during our recent
|
|
[https://github.com/genodelabs/genode/issues/4989 - Hack'n'Hike] event.
|
|
With this new model, USB devices can be passed through to the guest. It has
|
|
been successfully tested with several USB storage, keyboard, and audio
|
|
devices.
|
|
|
|
|
|
SDL2 improvements
|
|
=================
|
|
|
|
We enhanced our SDL2 port by enabling more subsystems, improving its window
|
|
handling, and adding support for its text-input API.
|
|
|
|
This release adds preliminary support window resizing. It works well for some
|
|
of the currently available ports but still has issues with others (especially
|
|
those using an OpenGL context) as it depends to some degree on the component
|
|
itself using the SDL2 library. As an additional feature, we added support for
|
|
setting the initial window geometry via the '<initial>' node, e.g.:
|
|
|
|
! <initial width="800" height="600"/>
|
|
|
|
This allows for restricting the initial window size because otherwise the
|
|
actual screen size will be used and that might be too large depending on the
|
|
attached display.
|
|
|
|
Support for using SDL2's text-input API has been enabled. Once the application
|
|
enables text input, any key press that has a valid Unicode codepoint is sent
|
|
as text input.
|
|
|
|
|
|
Curl updated to version 8.7.1
|
|
=============================
|
|
|
|
We updated our cURL port to version 8.7.1 to support the use of
|
|
elliptic-curve algorithms for TLS (CURLOPT_SSL_EC_CURVES).
|
|
|
|
In setups where no service is employed to provide entropy, it might be
|
|
necessary to increase the amount of statically configured entropy. Doubling
|
|
the content of the '<inline>' VFS plugin as used in static configurations
|
|
seems satisfactory. Furthermore, DNS resolving needs a configured '<pipe>'
|
|
plugin to work properly. For an exemplary configuration, please look at the
|
|
_repos/libports/run/fetchurl.inc_ run-script snippet.
|
|
|
|
The 'fetchurl' component also gained a 'verbose' configuration option to
|
|
enable verbose operations as a convenience feature to ease debugging.
|
|
|
|
|
|
Platforms
|
|
#########
|
|
|
|
NOVA microhypervisor
|
|
====================
|
|
|
|
Some of the command-line options changed. The 'iommu' option is now split up
|
|
into 'iommu_amd' and 'iommu_intel', so that they may be enabled/disabled
|
|
separately. The 'novga' option turned into 'vga' since it is unused nowadays.
|
|
The tagged TLB feature for virtual machines is now enabled by default.
|
|
|
|
The kernel now supports the 'mwait' instruction besides the 'hlt' instruction,
|
|
which can be used to give hints to the CPU to enter deeper sleep states.
|
|
The feature is off by default and can be utilized via the 'Pd::system_control'
|
|
interface.
|
|
|
|
|
|
Build system and tools
|
|
######################
|
|
|
|
Goa SDK
|
|
=======
|
|
|
|
Aligned with the Sculpt release, the Goa tool has been updated with the
|
|
corresponding depot archive versions for Sculpt 24.04. This also involved
|
|
adding support for the new audio play and record sessions.
|
|
|
|
The _Goa testbed_ package and preset have been updated accordingly so that
|
|
an out-of-the-box Sculpt 24.04 lends itself as a
|
|
[https://genode.org/documentation/release-notes/24.02#Sculpt_OS_as_remote_test_target_for_the_Goa_SDK - remote test target for Goa].
|