[GSoC] Rust bindings for the Genode API

Norman Feske norman.feske at ...1...
Fri Mar 3 11:24:45 CET 2017


Hello Saurav,

thank you for your interest in Genode and welcome to the list!

> I'm Saurav Sachidanand, and I'm a CS sophomore studying in India. For
> more than year I've been programming in Rust and have published some
> personal projects in it (few involving the Rust-C FFI) and have
> contributed a few patches to Servo (github.com/saurvs). I've also
> played around a bit with kernel modules in NetBSD.

That's a very interesting background.

> I'm interested in working on Rust bindings for the Genode API. I'm
> also completely new to Genode, and so I'll spend time reading the
> extensive documentation and the Genode Foundations book, and building
> and running Genode, and will do independent research on the project.
> I'd greatly appreciate any guidance and pointers regarding this
> project.

With Genode 16.05, we added basic support for Rust to Genode. In
particular, we integrated Rust's tool chain with Genode's build system
so that Genode components can incorporate Rust code quite easily. In
January, this integration was further improved as part of the Genode-ABI
line of work.

[1]
http://genode.org/documentation/release-notes/16.05#New_support_for_the_Rust_programming_language

You can find a very simple example scenario at 'libports/run/rust.run'.
The corresponding test program is located at 'libports/src/test/rust/'.
In the program's 'target.mk' file, you can see that the integration of
Rust code with a Genode component is as simple as adding the .rs source
files to the 'SRC_RS' variable.

That said, we have not actively used Rust in Genode yet. The logical
next step would be making (parts of) the Genode API available as Rust
bindings so that meaningful components could be implemented in Rust.
This topic has two stages:


Client components

Most Genode components are merely clients of other components (aka
servers). The interaction with those servers is based on the session
interfaces as explained in the book. Therefore, to allow a Rust-written
component to interact with the Genode world, Rust bindings for
client-side use of these interfaces are needed. I would probably start
with bindings for the 'LOG', ROM', 'Report', and 'Terminal' session
interfaces, which would already allow for a big variety on interesting
scenarios. At a later point, higher-level session interfaces (like
'Nic', or 'File_system') may be considered.

There are two particularly interesting aspects:

1. Applying the execution model of Genode's component API - where
   components are modeled as state machines that solely respond to
   external events - to idiomatic Rust language bindings. E.g.,
   How to best realize the Rust counter part of Genode's
   'Signal_handler' class template?

2. The representation of 'Genode::Capability' in Rust. In C++ the
   lifetime of capabilities is managed by modelling a capability as a
   shared smart pointer. How would Rust code refer to Genode
   capabilities in the best way? One option would be to wrap
   Genode::Capability objects in Rust objects. Another option would
   be to introduce an associative data structure.

3. The Genode API has a very rigid memory management scheme. E.g.,
   there are no anonymous heap allocations. All dynamic memory
   allocations must refer to a concrete allocator instance and are
   accounted for. Can this paradigm be sensibly transferred to Rust?


Server components

Once client components are able to interact with servers, it may be
interesting to look at the potential of implementing Genode servers in
Rust as well. Here, the server-side bindings for the session interfaces
come into play.


Further ideas

As you may know, the Redox project is part of the same GSoC mentoring
organization as Genode. So it might be interesting to explore the
opportunity by bring both projects closer together. One approach would
be to make Redox components (like drivers or file systems) usable as
Genode components similar to how we reuse Linux drivers via 'dde_linux'.
You may investigate creating 'dde_redox' with the potential of igniting
collaboration between the projects. Note that I see this as an
alternative direction to the one outlined above.

> I'd also like to ask if a scripting language has been ported to
> Genode. If not, I'd like to suggest working on porting Lua since it is
> widely used as embeddable and extensible language, and has a
> manageably-sized codebase so that it can be one half of a two part
> GSoC project.

You can find an example for Lua on Genode at 'libports/run/moon.run'.
Alternatively, you may have a look at the Python example at
'libports/run/python.run'. Admittedly, however, those examples are
merely toys as we have not cultivated the use of script languges on top
of Genode so far.

Cheers
Norman

-- 
Dr.-Ing. Norman Feske
Genode Labs

http://www.genode-labs.com · http://genode.org

Genode Labs GmbH · Amtsgericht Dresden · HRB 28424 · Sitz Dresden
Geschäftsführer: Dr.-Ing. Norman Feske, Christian Helmuth




More information about the users mailing list